二叉树的建立及遍历各种递归
2011-11-24 21:42
375 查看
递归简直太难了啊
#include<stdio.h>
#include<malloc.h>
#defineOK1
#defineERROR0
#defineTRUE1
#defineFLASE0
#defineOVERFLOW2
typedefintStatus;
#defineTElemTypechar
typedefstructBiTNode{
TElemTypedata;
structBiTNode*lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;
StatusCreateBiTree(BiTree&T)
{//先序建立二叉树
charch;
scanf("%c",&ch);
if(ch=='')
T=NULL;
else
{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T->data=ch;
CreateBiTree(T->lchild);//构造左子树
CreateBiTree(T->rchild);//构造右子树
}
returnOK;
}//CreateBiTree
StatusPrintElement(TElemTypee)
{
printf("%c",e);
returnOK;
}//相当于Visit函数
StatusPreOrderTraverse(BiTreeT,Status(*Visit)(TElemTypee))//先序遍历T的递归算法
{
if(T)
{
if(Visit(T->data))
if(PreOrderTraverse(T->lchild,Visit))
if(PreOrderTraverse(T->rchild,Visit))
returnOK;
returnERROR;
}
elsereturnOK;
}//PreOrderTraverse
StatusInOrderTraverse(BiTreeT)//中序递归遍历
{
if(T)
{
InOrderTraverse(T->lchild);//最左节点
printf("%c",T->data);
InOrderTraverse(T->rchild);
}
returnOK;
}
StatusPostOrderTraverse(BiTreeT)//后续递归遍历
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
}
returnOK;
}
intLeavesNum(BiTreeT)//递归法求叶子个数
{
if(T)
{
if((T->lchild==NULL)&&(T->rchild==NULL))
{
return1;
}
return(LeavesNum(T->lchild)+LeavesNum(T->rchild));
}
return0;
}
StatusExchange(BiTreeT)//递归法交换树的左右子树
{
BiTreetemp;
if(T)
{
Exchange(T->lchild);
Exchange(T->rchild);
temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp;
}
returnOK;
}
intDepth(BiTreeT)//求树的高度
{
intlh,rh;
lh=rh=0;
BiTreep=T;
if(p==NULL)
{
return0;
}
else
{
lh=Depth(p->lchild);
rh=Depth(p->rchild);
return(lh>rh?(lh+1):(rh+1));
}
}
intNum_Of_Node(BiTreeT)//求树的结点数
{
if(T==NULL)
return0;
else
returnNum_Of_Node(T->lchild)+Num_Of_Node(T->rchild)+1;
}
intmain()
{
BiTreeT;
printf("以先序序列建树:\n");
CreateBiTree(T);
printf("原树的前、中、后序遍历如下:\n");
PreOrderTraverse(T,PrintElement);
printf("\n");
InOrderTraverse(T);
printf("\n");
PostOrderTraverse(T);
printf("\n");
intleavesnum;
leavesnum=LeavesNum(T);
printf("原树的叶子数为:%d\n",leavesnum);
intdepth;
depth=Depth(T);
printf("原树的深度值为:%d\n",depth);
intnum_of_node;
num_of_node=Num_Of_Node(T);
printf("原树的结点数为:%d\n",num_of_node);
Exchange(T);//交换树的左右结点
printf("交换左右结点后的前中后序遍历为:\n");
PreOrderTraverse(T,PrintElement);
printf("\n");
InOrderTraverse(T);
printf("\n");
PostOrderTraverse(T);
printf("\n");
leavesnum=LeavesNum(T);
printf("交换后的叶子数为:%d\n",leavesnum);
depth=Depth(T);
printf("交换后树的深度为:%d\n",depth);
num_of_node=Num_Of_Node(T);
printf("交换后的结点数为:%d\n",num_of_node);
system("pause");
return0;
}
相关文章推荐
- 二叉树的建立、销毁、各种遍历(递归、非递归)
- 二叉树的建立、销毁、各种遍历(递归、非递归)
- 二叉树的建立、销毁、各种遍历(递归、非递归)
- 二叉树的建立及遍历各种递归
- SDUT 2136、2137 二叉树的建立与各种遍历
- python实现二叉树的建立以及遍历(递归前序、中序、后序遍历,队栈前序、中序、后序、层次遍历)
- 二叉树的建立及遍历(递归)
- 二叉树的建立,前中后序遍历的递归版本和非递归版本,层序遍历
- C++实现二叉树的建立和三种递归遍历
- 二叉树的各种递归和栈的遍历。
- 顺序结构实现二叉树的建立和各种遍历
- 二叉树的建立以及三种遍历方式的递归、非递归的实现
- 【数据结构基础】二叉树的建立和递归遍历
- (1)建立二叉树的二叉链表。 (2)写出对用二叉链表存储的二叉树进行先序、中序和后序遍历的递归和非递归算法。 (3)写出对用二叉链表存储的二叉树进行层次遍历算法。 (4)求二叉树的所有叶子及结点总数。
- 括号法递归建立二叉树并层序遍历输出
- 二叉树的建立 前序中序后序递归遍历及非递归遍历
- 二叉树的建立、遍历、添加、销毁(...递归)
- 二叉树的各种遍历的递归非递归实现。
- 二叉树建立,递归,非递归,前序,中序,后序遍历
- 二叉树的递归创建,以及二叉查找树查找的建立 和遍历查找的比较