二叉树遍历(中序+__=二叉树)

二叉树遍历 ( 中序 + _ _ = 二叉树 ) \Huge{二叉树遍历(中序+\_\_=二叉树)} 二叉树遍历(中序+__=二叉树)


跟据二叉树的性质,给出二叉树的中序遍历以及任意一种遍历顺序,即可构造出一棵唯一的二叉树。

前序遍历:跟左右

中序遍历:左根右

后序遍历:左右跟

层序遍历:按层展开

前序+中序

3598. 二叉树遍历 - AcWing题库

本题是前序+中序求后序

#include<bits/stdc++.h>

using namespace std;

void build(string s1, string s2) {
    if(s1.empty()) return;
    char val = s1[0];
    int k = s2.find(val);
    build(s1.substr(1, k), s2.substr(0, k));
    build(s1.substr(k + 1), s2.substr(k + 1));
    cout << val;
}

int main() {
    string a, b;
    while(cin >> a >> b) {
        build(a, b);
        cout << endl;
    }
    return 0;
}

后序+中序

1497. 树的遍历 - AcWing题库

本题是后序+中序求层序

#include<bits/stdc++.h>

using namespace std;

int n, a[10010], b[10010], p[10010];
vector<int> v[10010];

//la、ra表示后序遍历中的边界,lb、rb表示中序遍历中的边界,d表示层数
void build(int la, int ra, int lb, int rb, int d) {
    if(la > ra) return;
    int val = a[ra];
    int k = p[val];
    v[d].push_back(val);
    build(la, la + k - 1 - lb, lb, k - 1, d + 1);//左子树
    build(la + k - lb, ra - 1, k + 1, rb, d + 1);//右子树
}

int main() {
    cin >> n;
    for(int i = 0; i < n; i ++ ) cin >> a[i];//后序
    for(int i = 0; i < n; i ++ ) cin >> b[i];//中序
    for(int i = 0; i < n; i ++ ) p[b[i]] = i;
    
    build(0, n - 1, 0, n - 1, 0);
    
    for(int i = 0; i < n; i ++ ) 
        for(auto i : v[i])
            cout << i << ' ';
    
    return 0;
}

层序+中序

1259. 二叉树遍历 - AcWing题库

本题是层序+中序求前序

#include<bits/stdc++.h>

using namespace std;

string s1, s2;

void build(int l1 ,int r1, int l2, int r2) {
    int i, j;
    for(i = l2; i <= r2; i ++ ) {
        bool flag = false;
        for(j = l1; j <= r1; j ++ ) {
            if(s2[i] == s1[j]) {
                cout << s2[i];
                flag = true;
                break;
            }
        }
        if(flag) break;
    }
    if(j > l1) build(l1, j - 1, l2 + 1, r2);
    if(j < r1) build(j + 1, r1, l2 + 1, r2);
}

int main() {
    cin >> s1 >> s2;
    int n = s1.size();
    build(0, n - 1, 0, n - 1);

    return 0;
}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值