中序后序确定二叉树(大数据版)

题目

假设二叉树上各结点的权值互不相同且都为正整数。

给定二叉树的后序遍历和中序遍历,请你输出二叉树的前序遍历的最后一个数字。

数据范围

1≤N≤500001≤N≤50000,
二叉树结点权值范围 [1,1e9]。

思路

跟之前做的题不一样,数据范围大,开结点数组存储树节点会导致错误。所以利用map把中序遍历的下标存下来就好了,其他的还是与之前写过的类似。

代码

#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;

const int N = 50010;
//const int M = 1e9 + 10;

typedef long long ll;

int n;
vector<int> postOrder;
vector<int> inOrder;
unordered_map<int,int> m;

long long ans = 0;

// struct node{
//     int left;
//     int right;
// }nodes[M];

void build(int inL,int inR,int postL,int postR)
{
    if(postL > postR) return;
    int root = postOrder[postR];
    //获得中序遍历中根节点的下标
    int index = m[root];
    ans = root;
    //index-inL表示左节点数量
    build(inL,index - 1,postL,postL + index - inL - 1);
    build(index + 1,inR,postL &#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值