二叉树的建立(前序遍历法)

参考《大话数据结构》P187~188——二叉树的建立。

举个简单的例子:

代码和解释如下(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 //这里输入AB#D##C##
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 int main()
48 {
49     BiTNode **pp;//定义指向BiTNode的二级指针pp
50     BiTNode *p;//定义指向BiTNode的指针p
51     pp=&p;//pp指向p
52     p=NULL;//初始化p指向NULL
53 
54     CreateBiTree(pp);//传入指向p的地址,创建二叉树
55 
56     PreOrderTraverse(p);//传入指向BiTNode的地址,前序遍历创建好的二叉树,验证二叉树的创建是否正确
57     cout<<endl;
58 }

运行结果:

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