排序二叉树的遍历( 用递归或非递归的方法都可以)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序二叉树的遍历( 用递归或非递归的方法都可以)相关的知识,希望对你有一定的参考价值。

)排序二叉树的遍历( 用递归或非递归的方法都可以)
 1)问题描述
输入树的各个结点,建立排序二叉树,对建立的排序二叉树进行层次、先序、中序和后序遍历并统计该二叉树中叶子结点的数目。
2)基本要求
(1)用菜单实现
(2)能够输入树的各个结点,并能够输出用不同方法遍历的遍历序列和叶子结点的数目。
既然看你之前提过这个问题、、就麻烦你啦~

参考技术A #include<stdlib.h>
#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 = 

以上是关于排序二叉树的遍历( 用递归或非递归的方法都可以)的主要内容,如果未能解决你的问题,请参考以下文章

课设4---二叉树的操作

遍历二叉树的递归与非递归代码实现

二叉树的遍历——递归非递归实现

二叉树的遍历——递归非递归实现

转更简单的非递归遍历二叉树的方法

算法练习28:非递归方式遍历二叉树的先序中序后序