3.4之二叉树详解
#include<iostream>
using namespace std;
typedef struct node
{
struct node *lchild; //创建二叉树,分别表示左右两个节点
struct node *rchild;
char data;
}BiTreeNode, *BiTree;
void createBiTree(BiTree &T)
{ char c;
cin >> c;
if('#' == c)
T = NULL; //‘’#‘’表示二叉树不存在的节点
else
{
T = new BiTreeNode;
T->data=c;
createBiTree(T->lchild);
createBiTree(T->rchild); //输入的值分别赋值给左右两个节点(递归创建左右子树)
}
}
void preTraverse(BiTree T)
{
if(T)
{
cout<<T->data<<" "; //前序遍历,因为前面创建时候说明‘#’为空,所以先从首个结点判断,显示数值,依次判断左右子树,两边判断完回到结点并记录,若有子树则向下继续判断。
preTraverse(T->lchild); 若无子树,则返回上一层。直到所有结点遍历一遍结束。
preTraverse(T->rchild);
}
}
void midTraverse(BiTree T)
{
if(T)
{
midTraverse(T->lchild); //中序遍历:先在节点向左子树判断,有则继续向下,若无则返回,并记录数值。回到上一层结点记录数值,再判断右子树,直至所有结点遍历一遍结束
cout<<T->data<<" ";
midTraverse(T->rchild);
}
}
void postTraverse(BiTree T)
{
if(T)
{
postTraverse(T->lchild); //后序遍历:先在节点向左子树判断,有则继续向下,若无则返回,向右继续判断。无右子树则继续返回上一层,重复遍历,直到遍历至首结点结束
postTraverse(T->rchild);
cout<<T->data<<" ";
}
}
int main()
{
BiTree T;
createBiTree(T);
cout<<"二叉树创建完成!"<<endl;
cout<<"前序遍历二叉树:"<<endl;
preTraverse(T);
cout<<endl;
cout<<"中序遍历二叉树:"<<endl;
midTraverse(T);
cout<<endl;
cout<<"后序遍历二叉树:"<<endl;
postTraverse(T);
return 0;
}