#include"iostream.h"
#include"string.h"
#include"stdio.h"
#include"stdlib.h"
typedef int Etype;
typedef struct Bitnode
{
Etype date;
struct Bitnode* ltree, *rtree;
}Bitnode;
//递归法中序建立二叉树
Bitnode * creat_bt1()
{
Etype data;
Bitnode* pst;
cout<<"input the data!"<
if(data == 0) //表示输入0结束,如何我们要用0的话,
//可以再设置一个变量i,if(data == 0 && i ==0 )时,就结束,i作为控制结束用的确良。
{
pst = NULL;
return pst;
}
else
{
pst = new Bitnode;
pst->date = data;
cout<<"left"<
cout<<"right"<
pst->rtree = creat_bt1();
}
return pst;
}
//递归法中序遍历二叉树
void Inorder(Bitnode*p)
{
if(p)
{
Inorder(p->ltree );
cout<
Inorder(p->rtree );
}
}
//递归法先序遍历二叉树
void Preorder(Bitnode*p)
{
if(p)
{
cout<
Preorder(p->ltree );
Preorder(p->rtree );
}
}
//递归法后序遍历二叉树
void Postorder(Bitnode*p)
{
if(p)
{
Postorder(p->ltree );
Postorder(p->rtree );
cout<
}
}
void main()
{
Bitnode* pstu;
cout<<"建立二叉树!"<
cout<<"中序遍地输出:";
Inorder(pstu);
cout<
cout<<"先序遍地输出:";
Preorder(pstu);
cout<
cout<<"后序遍地输出:";
Postorder(pstu);
cout<
遍历方案
从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。
因此,在任一给定结点上,可以按某种次序执行三个操作:
(1)访问结点本身(N),
(2)遍历该结点的左子树(L),
(3)遍历该结点的右子树(R)。
以上三种操作有六种执行次序: NLR、LNR、LRN、NRL、RNL、RLN。
注意: 前三种次序与后三种次序对称,故只讨论先左后右的前三种次序。
三种遍历的命名
根据访问结点操作发生位置命名:
① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。
② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。
③ LRN:后序遍历(PostorderTraversal) ——访问结点的操作发生在遍历其左右子树之后。
注意: 由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又
可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历
前序遍历:根结点在最前面
中序遍历:根结点在中间
后序遍历:要结点在最后面