递归法中序建立二叉树


#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!"< cin>>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"< //方便输入数据到结点的左边
  pst->ltree = creat_bt1();
  cout<<"right"<//方便输入数据到结点的右边
  pst->rtree = creat_bt1();
  
 }
 return pst;
}

//递归法中序遍历二叉树
void Inorder(Bitnode*p)
{
 if(p)
 {
  Inorder(p->ltree );
  cout<date<<" ";
  Inorder(p->rtree );
 }
}

//递归法先序遍历二叉树
void Preorder(Bitnode*p)
{
 if(p)
 {
  cout<date<<" ";
     Preorder(p->ltree );
  Preorder(p->rtree );
 }
}
//递归法后序遍历二叉树
void Postorder(Bitnode*p)
{
 if(p)
 {
  Postorder(p->ltree );
  Postorder(p->rtree );
  cout<date<<" ";
    
 }
}

 


void main()
{
 Bitnode* pstu;
 cout<<"建立二叉树!"< pstu = creat_bt1();
 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分别又称为先根遍历、中根遍历和后根遍历

前序遍历:根结点在最前面
中序遍历:根结点在中间
后序遍历:要结点在最后面

你可能感兴趣的:(C++)