递归法中序建立二叉树


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

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

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

 


void main()
{
 Bitnode* pstu;
 cout<<"建立二叉树!"<<endl;
 pstu = creat_bt1();
 cout<<"中序遍地输出:";
 Inorder(pstu);
 cout<<endl;

 cout<<"先序遍地输出:";
 Preorder(pstu);
 cout<<endl;

 cout<<"后序遍地输出:";
 Postorder(pstu);
 cout<<endl;
}

遍历方案
  从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。
因此,在任一给定结点上,可以按某种次序执行三个操作:
   (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分别又称为先根遍历、中根遍历和后根遍历

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值