天梯练习:树的遍历

思路分析:

  这道题主要就是根据后序和中序遍历进行建树。

  (1)定义一个树的结构体,结构体成员包含当前节点的左儿子和右儿子。

  (2)定义一个建树的函数,由于后序遍历的最后一位是当前数的根节点,所以在中序遍历中找到根节点的位置,然后分为左右子树继续递归。最后返回整个树的根节点。

  (3)定义一个层序遍历的函数,传入的是根节点,然后根据队列的方式每次都是先放左儿子再放右儿子。

代码实现:

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int l;
    int r;
}tree[10010];
int zhong[10010],hou[10010];
queue<int>q;
int n;
int buildtree(int left,int right,int begin,int end)
{      if(left>right||begin>end)
          return -1;
      int root=hou[right];
      int p;
      for(int i=begin;i<=end;i++)
         if(zhong[i]==root)
           {
                p=i;
                break;
           }
       int sx=p-begin;
       int sy=end-p;
       tree[root].l=buildtree(left,left+sx-1,begin,begin+sx-1);
       tree[root].r=buildtree(right-sy,right-1,end-sy+1,end);
      return root;
}
void ceng(int root)
{   int num;
    q.push(root);
    while(!q.empty())
    {
        num=q.front();
        q.pop();
        if(tree[num].l!=-1)
        {
            q.push(tree[num].l);
        }
        if(tree[num].r!=-1)
        {
            q.push(tree[num].r);
        }
        if(num==root)
          cout<<num;
          else cout<<" "<<num;
    }
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
     cin>>hou[i];

     for(int i=0;i<n;i++)
       cin>>zhong[i];

    struct node k;
 
    int root;
    root=buildtree(0,n-1,0,n-1);
     ceng(root);
    return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值