欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

## 二叉树的建立以及先序,中序,后序遍历

程序员文章站 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); 
 } 

运行图示
## 二叉树的建立以及先序,中序,后序遍历
其实在我个人看来,二叉树的建立过程并不难,它的建立过程和输出过程都有用到了一个极其重要的思想递归,只要把递归的层次关系搞明白,这些东西也就迎刃而解了.
以上是个人的一些理解,有不当之处还请大佬多多指教。