二叉树三种遍历的相互转换

1.已知先序中序求后序

    只要掌握各个遍历的特点,就能轻松解决问题 先序:给定了根的遍历顺序 中序:根的左右两边分别为左子树和右子树 所以可以通过控制根的位置 递归进入左子树和右子树 控制格式输出即可

    

#include <bits/stdc++.h>
#define N 1005
using namespace std;
int a[N];int b[N];
int n;
void dfs(int l,int r,int size){
    if(size==0) return ;
    int i;
    for(i=1;i<=size;i++){
        if(a[l]==b[i+r-1]) break;
    }
    dfs(l+1,r,i-1);
    dfs(l+i,i+r,size-i);
    if(size==n) printf("%d\n",a[l]);
    else printf("%d ",a[l]);
}
int flag;
int main(){
    while(scanf("%d",&n)==1){
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        for(int i=1;i<=n;i++){
            scanf("%d",&b[i]);
        }
        dfs(1,1,n);
    }
    return 0;
}

 2.已知中序后序求前序

   可以根据左子树的个数在中序和后序中相等的规则 可以确定进入左子树的根的位置 而进入右子树的根的位置则为前一个根的位置-1 然后递归进行即可

   

#include <bits/stdc++.h>
#define N 1005
using namespace std;
int a[N];int b[N];
int n;
void dfs(int l,int r,int size){
    if(size==0) return ;
    if(size==n) printf("%d",a[l]);
    else printf(" %d",a[l]);
    int i;
    for(i=1;i<=size;i++){
        if(a[l]==b[r+i-1]) break;
    }
    dfs(l-(size-i+1),r,i-1);
    dfs(l-1,r+i,size-i);
}
int flag;
int main(){
      while(scanf("%d",&n)==1){
      for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        for(int i=1;i<=n;i++){
           scanf("%d",&b[i]);
       }
        dfs(n,1,n);
        printf("\n");
    }
    return 0;
}

  

转载于:https://www.cnblogs.com/wang9897/p/7835404.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值