采用递归的方式来创建并遍历二叉树,从理解上而言是非常简单的。
具体实现代码如下(运行环境dev C++):https://github.com/vanyongqi/Algorithm/blob/master/BuildTree.cpp
首先 先明白二叉树的结构:节点由一个数据域和两个指针域分别指向着该节点的左孩子和右孩子。
typedef struct BTree{
char data;
struct BTree *lchild;
struct BTree *rchild;
}BinTree,*Btree;
二叉树的创建:
Btree CreateTree(BinTree *T){
char data;
cin>>data;
if(data== '@'){//若输入为@ 则代表该节点为叶子节点
T= NULL;
}
else{
T = new BinTree;//创建新节点
T->data = data;
cout<<"输入"<<data<<"的左孩子 ";
T->lchild = CreateTree(T->lchild);//递归创建左孩子
cout<<"输入"<<data<<"的右孩子 ";
T->rchild = CreateTree(T->rchild);//递归创建右孩子
}
return T;//注意返回类型为BTree类型
}
二叉树的遍历(先序)讲解:
所谓的先序(根左右)中序(左根右)后序(左右根) 都是再说根节点,这是一个习惯上的约定。无需深究。
递归性的遍历是十分简单的,只要当前节点不为空,访问该节点元素,然后递归的去遍历。
代码如下:
void PreOrderTraverse(BinTree *T){//先序
if(T){
cout<<T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
同样道理中序 和后序亦是如此,只是访问根节点的顺序相应的发生改变。
void InOrderTraverse(BinTree *T){//中序
if(T){
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BinTree *T){//后序遍历
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data;
}
}
计算二叉树的节点数目
同样是一个很简单的方式,怪不得有人说递归是一种很优雅的方式。用极少的代码去解释事情的本质,不过挺占内存的。
递归基:当碰见叶子节点的时候,返回值为1.
代码如下:
int Count(BinTree *T){
if(T==NULL) return 0;
else if((T->lchild==NULL)&&(T->rchild==NULL))
return 1;
else{
return Count(T->lchild)+Count(T->rchild);
}
}