排序二叉树的遍历( 用递归或非递归的方法都可以)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序二叉树的遍历( 用递归或非递归的方法都可以)相关的知识,希望对你有一定的参考价值。
)排序二叉树的遍历( 用递归或非递归的方法都可以)
1)问题描述
输入树的各个结点,建立排序二叉树,对建立的排序二叉树进行层次、先序、中序和后序遍历并统计该二叉树中叶子结点的数目。
2)基本要求
(1)用菜单实现
(2)能够输入树的各个结点,并能够输出用不同方法遍历的遍历序列和叶子结点的数目。
既然看你之前提过这个问题、、就麻烦你啦~
#include<stdio.h>
#define MAX 10
typedef struct node
char data;
struct node *lchild;
struct node *rchild;
Node,*Tree;
typedef struct Stack
Node *elem[MAX];
int top;
*stack;
//两个遍历序列
char pre_or_post[MAX];
char inorder[MAX];
//函数申明
int locate(char m[MAX],char c);//找到中序序列中二叉树的根位置下标
void PreVisit(Tree root);//先序递归遍历
void InVisit(Tree root);//中序递归遍历
void PostOrder(Tree root);//后序递归遍历
int TotalElem(char *str);//取得数组元素个数
void CreateBiTree(Tree *bt);//扩展先序建立二叉树
void CreateTree(Tree *t,int lowp,int highp,int lowi,int highi);//根据先序和中序建立二叉树
void Create(Tree *t,int lowp,int highp,int lowi,int highi);//根据后序和中序建立二叉树
void InitStack(stack s);//初始化栈
void Push(stack s,Node n);//压栈
Node *Pop(stack s,Node *n);//出栈
int IsEmpty(stack s);//判断栈是否为空
void Inorder(Tree root);//中序遍历二叉树的非递归实现
void PostVisit(Tree root);//后序遍历二叉树的非递归实现
void PreOrder(Tree root);//先序遍历二叉树的非递归实现
//函数实现
//找到中序序列中二叉树的根位置下标
int locate(char inorder[MAX],char c)
int i = 0;
while(inorder[i] != '\0')
if(inorder[i] == c)
return i;
else
i ++;
return -1;
//先序递归遍历
void PreVisit(Tree root)
if(root != NULL)
printf("%c ",root->data);
PreVisit(root->lchild);
PreVisit(root->rchild);
//中序递归遍历
void InVisit(Tree root)
if(root != NULL)
InVisit(root->lchild);
printf("%c ",root->data);
InVisit(root->rchild);
//后序递归遍历
void PostOrder(Tree root)
if(root != NULL)
PostOrder(root->lchild);
PostOrder(root->rchild);
printf("%c ",root->data);
//取得数组元素个数
int TotalElem(char *str)
int total = 0;
while(str[total] != '\0')
total ++;
return total;
//扩展先序建立二叉树
void CreateBiTree(Tree *bt)
char ch;
ch = getchar();
if(ch == '#')
*bt = NULL;
else
*bt = (Tree)malloc(sizeof(Node));
(*bt)->data = ch;
CreateBiTree(&((*bt)->lchild));
CreateBiTree(&((*bt)->rchild));
//根据先序和中序建立二叉树
void CreateTree(Tree *t,int lowp,int highp,int lowi,int highi)
if(lowp <= highp)
int pos = locate(inorder,pre_or_post[lowp]);
(*t) = (Node*)malloc(sizeof(Node));
(*t)->data = pre_or_post[lowp];
CreateTree(&(*t)->lchild,lowp+1,lowp+(pos-lowi),lowi,pos-1);
CreateTree(&(*t)->rchild,lowp+(pos-lowi)+1,highp,pos+1,highi);
else
*t = NULL;
//根据后序和中序建立二叉树
void Create(Tree *t,int lowp,int highp,int lowi,int highi)
if(lowp <= highp)
int pos = locate(inorder,pre_or_post[highp]);
(*t) = (Node*)malloc(sizeof(Node));
(*t)->data = pre_or_post[highp];
Create(&(*t)->lchild,lowp,lowp+(pos-lowi)-1,lowi,pos-1);
Create(&(*t)->rchild,lowp+(pos-lowi),highp-1,pos+1,highi);
else
*t = NULL;
//初始化栈
void InitStack(stack s)
s->top = -1;
//压栈
void Push(stack s,Node *n)
if(s->top == MAX - 1)
printf("栈已满!\n");
return;
else
s->top ++;
s->elem[s->top] = n;
//出栈
Node *Pop(stack s)
Node *n;
if(s->top == -1)
printf("栈为空!\n");
return NULL;
else
n = s->elem[s->top];
s->top --;
return n;
//判断栈是否为空
int IsEmpty(stack s)
if(s->top == -1)
return 1;
else return 0;
//先序遍历二叉树的非递归实现
void PreOrder(Tree root)
Tree p;
Stack s;
InitStack(&s);
p = root;
Tree m[MAX];
int top = -1;
while(top != -1 || p != NULL)
while(p != NULL)
top ++;
m[top] = p;
printf("%c ",p->data);
p = p->lchild;
if(top != -1)
p = m[top];
top --;
p = p->rchild;
//中序遍历二叉树的非递归实现
void Inorder(Tree root)
Tree p;
Stack s;
InitStack(&s);
p = root;
while(p != NULL || !IsEmpty(&s))
if(p != NULL)
Push(&s,p);
p = p->lchild;
else
p = Pop(&s);
printf("%c ",p->data);
p = p->rchild;
//后序遍历二叉树的非递归实现
void PostVisit(Tree root)
Node *p,*q;
Tree s[MAX + 1];
int top = 0;
q = NULL;
p = root;
while(p != NULL || top != 0)
while(p != NULL)
top ++;
if(top >= MAX)
printf("栈溢出!程序错误!\n");
s[top] = p;
p = p->lchild;
if(top > 0)
p = s[top];
if((p->rchild == NULL) || (p->rchild == q))
printf("%c ",p->data);
q = p;
top --;
p = NULL;
else
p = p->rchild;
//主函数
int main(void)
int flag;
Tree T = NULL;
printf("\n请选择已知序列情况:1、先序和中序。2、后序和中序。3、用扩展先序建立\n");
scanf("%d",&flag);
switch(flag)
case 1:
printf("请输入先序字符数组:");
scanf("%s",pre_or_post);
printf("请输入中序字符数组:");
scanf("%s",inorder);
CreateTree(&T,0,TotalElem(pre_or_post)-1,0,TotalElem(inorder)-1);
break;
case 2:
printf("请输入后序字符数组:");
scanf("%s",pre_or_post);
printf("请输入中序字符数组:");
scanf("%s",inorder);
Create(&T,0,TotalElem(pre_or_post)-1,0,TotalElem(inorder)-1);
break;
case 3:
printf("请输入扩展先序字符串:");
fflush(stdin);
CreateBiTree(&T);
break;
printf("\n递归遍历如下:\n");
printf("\n先序遍历: ");
PreVisit(T);
printf("\n中序遍历: ");
InVisit(T);
printf("\n后序遍历: ");
PostOrder(T);
printf("\n");
printf("\n非递归遍历如下:\n");
printf("\n先序遍历: ");
PreOrder(T);
printf("\n中序遍历: ");
Inorder(T);
printf("\n后序遍历: ");
PostVisit(T);
printf("\n");
return 0;
统计叶子节点自己加一个函数吧,不难的追问
……加在哪、、、、
追答层次遍历的时候判断左右子树是不是空就可以统计叶子节点啊。。。
九十五二叉树的递归和非递归的遍历算法模板
@Author:Runsen
刷Leetcode,需要知道一定的算法模板,本次先总结下二叉树的递归和非递归的遍历算法模板。
二叉树的四种遍历方式,前中后加上层序遍历。对于二叉树的前中后层序遍历,每种遍历都可以递归和循环两种实现方法,且每种遍历的递归实现都比循环实现要简洁。下面做一个小结,看了《代码随想录》哈工大大佬的刷题指南,深受启发,因,下面代码有一定来源《代码随想录》。
递归
下面伪代码是二叉树遍历的递归算法模板,顺序是中左右,也就是前序遍历,改变中左右三行代码的顺序,前中后序三种递归遍历轻松解决。
def preorderTraversal(root: TreeNode) -> List[int]:
res =
以上是关于排序二叉树的遍历( 用递归或非递归的方法都可以)的主要内容,如果未能解决你的问题,请参考以下文章