## 二叉树的建立以及先序,中序,后序遍历
程序员文章站
2022-05-06 21:29:58
...
二叉树的建立以及先序,中序,后序遍历。
二叉树的建立
我们知道,给我们一个二叉树,我们可以写出它的先序遍历,后序遍历,中序遍历,我们可以根据先序和后序建立一个二叉树。首先我们得知道一个二叉树的先序遍历或者后序遍历,其次还需要知道给节点赋值为空的一个结束条件。本文以先序为例创建二叉树,以数字0表示赋值为空的条件.
在这里我们定义节点存放的数据为整型类型,给节点赋空的条件是从键盘输入数字0。
比如我们知道这样的一个二叉树
想要建立这个二叉树二叉树,我们就要依次从键盘输入124005003600700;
这样,我们就建立好了一个二叉树,接下来就是输出该二叉树,我们现在已有的是根节点的地址,要分别输出该二叉树的先序遍历,中序遍历,后序遍历
先序遍历
中序遍历
后序遍历
三种遍历输出仅有一个差别,就是printf的位置不同,先序是先输出节点数据,再依调用它自己,以此类推,中序和后序的原理类似.
;
接下来看完整代码
#include<stdio.h>
#include<stdlib.h>
struct tree{
int a;
struct tree *r; /*指向节点的左孩子*/
struct tree *l; /*指向节点的右孩子*/
};
struct tree *creattree() /*创建二叉树的函数*/
{
struct tree *p;
int a; /*该变量的作用是给二叉树的节点赋值*/
scanf("%d",&a);
if(a==0) /*如果要赋给节点的值是0,则返回NULL*/
p=NULL;
else /*如果赋给节点的值不是0,执行以下程序*/
{
p=(struct tree *)malloc(sizeof(struct tree));/*申请空间*/
p->a=a; /*将值传进该节点*/
p->l=creattree(); /*调用自己creattree*/
p->r=creattree(); /*要注意这两行的顺序,我们是以先序遍历输入的,所以左孩子在前,右孩子在后*/
}
return p;
}
void printxtree(struct tree *p)
{
if(p)
{
printf("%d",p->a);
printxtree(p->l);
printxtree(p->r);
}
}
void printztree(struct tree *p)
{
if(p)
{
printztree(p->l);
printf("%d",p->a);
printztree(p->r);
}
}
void printhtree(struct tree *p)
{
if(p)
{
printhtree(p->l);
printhtree(p->r);
printf("%d",p->a);
}
}
void main(){
struct tree *p;
printf("输入二叉树的先根序列\n");
p=creattree();
printf("建立成功\n");
printf("先根序列\n");
printxtree(p);
printf("\n中根序列\n");
printztree(p);
printf("\n后根序列\n");
printhtree(p);
}
运行图示
其实在我个人看来,二叉树的建立过程并不难,它的建立过程和输出过程都有用到了一个极其重要的思想递归,只要把递归的层次关系搞明白,这些东西也就迎刃而解了.
以上是个人的一些理解,有不当之处还请大佬多多指教。
推荐阅读