利用广义表非递归构造二叉树

#include<iostream>
using namespace std;
const int nax=100;
typedef struct tr
{
 int data,left,right;
 int label;
}btree;
btree tree[100];
bool ck[100];
int recreat(int *mid,int *post,int len)//len结点个数
{
 int i,j,root=0,troot;//troot是暂时根节点
 for(i=0;i<len;i++)
 {
  tree[i].data=mid[i];
  tree[i].left=tree[i].right=-1;
  tree[i].label=i;
 }
 while(post[len-1]!=tree[root].data)//寻找根节点在中序遍历数组中的位置
  root++;
 /*从后序节点的倒数第二个开始扫描,依次与中序遍历的节点比较,找到其中序数组中的位置时,
 用j记录下来,然后比较他的label值与根节点的label值,看看是左孙子,还是右孙子*/
 for(i=len-2;i>=0;i--)
 {
  troot=root;
  j=0;
  while(post[i]!=tree[j].data)j++;
  while(troot!=-1)
  {
   if(tree[j].label<tree[troot].label)//插在左侧
   {
    if(tree[troot].left==-1)
    {
     tree[troot].left=j;
     troot=-1;
    }
    else
     troot=tree[troot].left;
   }
   else
    if(tree[j].label>tree[troot].label)
    {
     if(tree[troot].right==-1)
     {
      tree[troot].right=j;
      troot=-1;
     }
     else
      troot=tree[troot].right;
    }
  }
 }
 return root;
}
void displaya(int root)//按照中序左根右的顺序输出,递归的详细版
{
 if (tree[root].left!=-1 && tree[root].right!=-1)
 {
  displaya(tree[root].left);
  printf("%d ",tree[root].data);
  displaya(tree[root].right);
 }
 else if (tree[root].left==-1 && tree[root].right!=-1)
 {
     printf("%d ",tree[root].data);
        displaya(tree[root].right);
 }
 else if (tree[root].right==-1 && tree[root].left!=-1)
 {
     displaya(tree[root].left);
     printf("%d ",tree[root].data);
 }
 else printf("%d ",tree[root].data);
}
void displayb(int root)//先序根左右
{
 if(root!=-1)
 {
  printf("%d ",tree[root].data);
  displayb(tree[root].left);
  displayb(tree[root].right);
 }
}
int main()
{
 int i,n,mid[nax],post[nax];
 memset(ck,0,sizeof(ck));
 scanf("%d",&n);
 for(i=0;i<n;i++)
  scanf("%d",&mid[i]);
 for(i=0;i<n;i++)
  scanf("%d",&post[i]);
 //display(recreat(mid,post,n));
 displayb(recreat(mid,post,n));
 return false;
}
文章出处:DIY部落(http://www.diybl.com/course/3_program/c++/cppjs/20091012/178565.html)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值