二叉树的建立以及前序遍历、中序遍历、后序遍历
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;
}
#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;
}
相关文章推荐
- 扩展二叉树 建立 以及 前序遍历 中序遍历 后序遍历 的非递归算法
- java编写二叉树以及前序遍历、中序遍历和后序遍历
- C++数据结构--二叉树的建立,前序遍历,中序遍历和后序遍历
- C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历、中序遍历、后续遍历)
- C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历、中序遍历、后续遍历)
- 二叉树创建、前序遍历、中序遍历、后序遍历 的 递归与非递归实现 以及 层次遍历
- 二叉树以及前序遍历、中序遍历和后序遍历
- C++二叉树之构造拷贝赋值,递归和非递归的前序遍历,中序遍历和后序遍历,以及层序遍历
- c之二叉树链表操作---建立、(递归)前序遍历、中序遍历、后序遍历
- java编写二叉树以及前序遍历、中序遍历和后序遍历 .
- 二叉树的建立,前序遍历,中序遍历,后序遍历
- 二叉树建立,前序遍历,中序遍历,后序遍历 思路
- 二叉树的创建、前序遍历、中序遍历、后序遍历
- 已知二叉树的中序遍历和前序遍历,如何求后序遍历
- 二叉树的建立以及前序、中序、后序遍历的递归和非递归实现
- 二叉树的前序遍历,中序遍历,后序遍历以及相互之间的求法
- [二叉树建树] 后序遍历与中序遍历建立二叉树
- 二叉树的先序遍历、中序遍历以及后序遍历(递归以及非递归方式)
- 二叉树相关操作(前序遍历,中序遍历,后序遍历,层次序遍历等)递归和非递归实现
- 二叉树系列:已知二叉树的中序遍历和前序遍历,求后序遍历