标签:
参考《大话数据结构》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 }
运行结果:
下图方便理解递归。但写递归代码的时候不用这么麻烦,毕竟人脑更擅长考虑递推。重点放在求解目标上,以及递归结束的条件。
标签:
原文地址:http://www.cnblogs.com/hslzju/p/5407757.html