二叉树的重构(简单easy版)

该代码实现了一个递归函数来构造一棵由前序和中序遍历序列定义的二叉树,并输出后序遍历序列。输入包括树的节点数,前序和中序遍历序列,程序通过递归将这两个序列转化为二叉树结构,并按后序遍历顺序打印节点。给定的测试数据为9个节点的二叉树,其前序和中序遍历分别为123456789和325461879,输出的后序遍历序列为356428971。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;


int n,pos;
vector<int> pre,in,post;
void rec(int l,int r){
    if (l>=r){
        return;
    }
    int root =pre[pos++];
    int m=distance(in.begin(),find(in.begin(),in.end(),root));
    rec(l,m);
    rec(m+1,r);
    post.push_back(root);
}



void solve (){
    pos = 0;
    rec(0,pre.size());
    for (int i = 0; i < n; ++i) {
       if (i)
           cout<<" ";
       cout<<post[i];
    }
    cout<<endl;

}

int main() {
    int k;
    cin>>n;
    for (int i = 0; i < n; ++i) {
        cin>>k;
        pre.push_back(k);
    }

    for (int i = 0; i < n; ++i) {
        cin>>k;
        in.push_back(k);
    }

    solve();
    return 0;
}

    if (l>=r){
        return;
    }
    int root =pre[pos++];
    int m=distance(in.begin(),find(in.begin(),in.end(),root));
rec(l,m);
rec(m+1,r);

这块可能 不是很理解
愚钝的我 自己大概模糊跑了一遍
现在讲一下我对

    rec(l,m);
    rec(m+1,r);

这个东西的理解

首先

    rec(l,m);

这个是不断的找左字树 , 一直找到最后的叶节点,此时 l-m=0

然后返回

  rec(m+1,r);

那 在 (l-m=0)之前 L-M 肯定是等于1 的

因为他的左叶节点 和 他的父亲是 1 的差距

这就是

  rec(m+1,r);

然后 就会 回溯到 父节点 就会 变成(m+1, r)
然后就会遍历父节点的右字数

感觉 很类似二分的思想(但不是精准的二分)

r - m+1就是 右字数的大小

说实话 能看懂我这的应该只有我自己

测试数据

9
1 2 3 4 5 6 7 8 9
3 2 5 4 6 1 8 7 9

运行结果

3 5 6 4 2 8 9 7 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值