您的位置:首页 > 其它

二叉树的建立以及前序遍历、中序遍历、后序遍历

2017-08-11 11:31 316 查看
这几天在复习数据结构,参考的书籍是《大话数据结构》,刚开始我一直不明白,在函数CreateBiTree中为什么要传入一个BiTree的指针。因为我认为BiTree它本身不就是一个指针吗,为什么还要搞一个指针的指针,我就去除那个*,发现不能正常的建树。到网上查阅资料后才发现,原来我们在建树的过程中,我们需要改变BiTree的值,如果我只传入一个BiTree对象,是改不了他的值,形参不会对实参有影响。如果我们想改变一个对象的值,我们必须传入一个该对象的指针,或者引用该对象,才会使该对象的值发生改成。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <algorithm>

using namespace std;
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree *T)//T是一个指向BiTree对象的指针。根据前序表达式建立二叉树
{
char ch;
scanf("%c",&ch);
if(ch=='#')
*T=NULL;
else
{
*T=(BiTree)malloc(sizeof(BiTNode));//*T=BiTree,BiTree本身是一个指针。
(*T)->data=ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
void PreOrderTraverse(BiTree T)//前序遍历
{
if(T==NULL)
return;
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
void InOrderTraverse(BiTree T)//中序遍历
{
if(T==NULL)
return;
InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
}
void PostOrderTraverse(BiTree T)//后序遍历
{
if(T==NULL)
return;
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
}
int main()
{
BiTree T=(BiTree)malloc(sizeof(BiTNode));
CreateBiTree(&T);//改变一个对象的值要么传入一个引用,要么传入一个指针。
PreOrderTraverse(T);
cout<<endl;
InOrderTraverse(T);
cout<<endl;
PostOrderTraverse(T);
cout<<endl;
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐