二叉树的三种遍历(前序,中序,后序)

参考《大话数据结构》P178~184——二叉树的遍历。

用书上的这个二叉树:

代码和解释如下(VS2012测试通过):

 1 #include <iostream>
 2 using namespace std;
 3 
 4 //二叉树的二叉链表结点结构定义
 5 typedef struct BiTNode
 6 {
 7     char  data;
 8     struct BiTNode *lchild,*rchild;
 9 }BiTNode;
10 
11 //输入前序遍历,创建二叉树
12 //这里输入ABDH#K###E##CFI###G#J##
13 void CreateBiTree(BiTNode **T)//*T是指向BiTNode的指针
14 {
15     *T=new BiTNode;
16     if(*T==NULL)//如果*T还是指向NULL,表示内存分配失败,退出程序
17         exit(OVERFLOW);
18     char ch;
19     cin>>ch;
20     if(ch=='#')
21         *T=NULL;
22     else
23     {
24         (*T)->data=ch;//*T指向的节点的data分配内容,即生成根节点
25         CreateBiTree(&((*T)->lchild));//创建&(*T)->lchild临时变量,传入CreateBiTree,构造左子树
26         CreateBiTree(&((*T)->rchild));//创建&(*T)->rchild临时变量,传入CreateBiTree,构造右子树
27         // 相当于
28         // BiTNode **p1;  
29         // p1=&((*T)->lchild);//不能直接p1=&lchild
30         // CreateBiTree(p1);
31         // BiTNode **p2;  
32         // p2=&((*T)->rchild);//不能直接p2=&rchild
33         // CreateBiTree(p2);
34     }
35 }
36 
37 //二叉树的前序遍历
38 void PreOrderTraverse(BiTNode *B)
39 {
40     if(B==NULL) return;//如果指向空结点,直接返回
41     cout<<B->data<<" ";//输出该结点的data
42     PreOrderTraverse(B->lchild);//前序遍历左子树
43     PreOrderTraverse(B->rchild);//前序遍历右子树
44     return;
45 }
46 
47 //二叉树的中序遍历
48 void InOrderTraverse(BiTNode *B)
49 {
50     if(B==NULL) return;//如果指向空结点,直接返回
51     PreOrderTraverse(B->lchild);//中序遍历左子树
52     cout<<B->data<<" ";//输出该结点的data
53     PreOrderTraverse(B->rchild);//中序遍历右子树
54     return;
55 }
56 
57 //二叉树的后序遍历
58 void PostOrderTraverse(BiTNode *B)
59 {
60     if(B==NULL) return;//如果指向空结点,直接返回
61     PreOrderTraverse(B->lchild);//后序遍历左子树
62     PreOrderTraverse(B->rchild);//后序遍历右子树
63     cout<<B->data<<" ";//输出该结点的data
64     return;
65 }
66 
67 int main()
68 {
69     BiTNode **pp;//定义指向BiTNode的二级指针pp
70     BiTNode *p;//定义指向BiTNode的指针p
71     pp=&p;//pp指向p
72     p=NULL;//初始化p指向NULL
73 
74     CreateBiTree(pp);//传入指向p的地址,创建二叉树
75 
76     PreOrderTraverse(p);//传入指向BiTNode的地址,前序遍历创建好的二叉树
77     cout<<endl;
78     InOrderTraverse(p);//传入指向BiTNode的地址,中序遍历创建好的二叉树
79     cout<<endl;
80     PostOrderTraverse(p);//传入指向BiTNode的地址,后序遍历创建好的二叉树
81     cout<<endl;
82 }

运行结果:

下图方便理解递归。但写递归代码的时候不用这么麻烦,毕竟人脑更擅长考虑递推。重点放在求解目标上,以及递归结束的条件。

posted @ 2016-04-19 12:54  Pearl_zju  阅读(711)  评论(0编辑  收藏  举报