首页 > 其他分享 >106. 从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树

106. 从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树

时间:2023-04-07 16:46:48浏览次数:41  
标签:vector preorder 遍历 root right 二叉树 序列 inorder postorder

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗二叉树 。

class Solution {
public:
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        if (postorder.size() == 0) return NULL;
        TreeNode* root = new TreeNode(postorder.back());
        if (postorder.size() == 1) return root;
        auto it = find(inorder.begin(),inorder.end(),root->val);
        vector<int> left_inorder(inorder.begin(),it);
        vector<int> right_inorder(it+1,inorder.end());
        int dis = distance(inorder.begin(),it);
        it = postorder.begin() + dis;
        vector<int> left_postorder(postorder.begin(),it);
        vector<int> right_postorder(it,postorder.end()-1);
        if(left_inorder.size())
        {
            root->left = buildTree(left_inorder,left_postorder);
        }
        if(right_inorder.size())
        {
            root->right = buildTree(right_inorder,right_postorder);
        }
        return root;
    }
};

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if (preorder.size() == 0) return NULL;
        TreeNode* root = new TreeNode(preorder.front());
        if (preorder.size() == 1) return root;
        auto it = find(inorder.begin(),inorder.end(),root->val);
        vector<int> left_inorder(inorder.begin(),it);
        vector<int> right_inorder(it+1,inorder.end());
        int dis = distance(inorder.begin(),it);
        it = preorder.begin() + 1 + dis;
        vector<int> left_preorder(preorder.begin()+1,it);
        vector<int> right_preorder(it,preorder.end());
        if(left_inorder.size())
        {
            root->left = buildTree(left_preorder,left_inorder);
        }
        if(right_inorder.size())
        {
            root->right = buildTree(right_preorder,right_inorder);
        }
        return root;
    }
};

标签:vector,preorder,遍历,root,right,二叉树,序列,inorder,postorder
From: https://www.cnblogs.com/lihaoxiang/p/17296656.html

相关文章

  • js数据遍历几种方式
    在JavaScript中,有多种方式可以遍历数据集,下面列出了常用的几种:for循环for循环是一种常见的遍历数据集的方式,可以用于遍历数组、对象等数据类型。例如:constarr=[1,2,3];for(leti=0;i<arr.length;i++){console.log(arr[i]);}constobj={a:1,b:2,......
  • 记spring-security升级,引发的redis反序列化不一致问题
    问题解决参考文章如下:https://my.oschina.net/klblog/blog/5559133https://blog.csdn.net/qq_37421368/article/details/124850449问题复现由于一些原因,登录的token由旧版本的微服务存入的redis,另一个新版本的微服务需要取出数据校验springboot版本升级导致spring-secu......
  • [蓝桥杯 2021 国 AB] 翻转括号序列(线段树上二分)
    [蓝桥杯2021国AB]翻转括号序列题目描述给定一个长度为\(n\)的括号序列,要求支持两种操作:将\(\left[L_{i},R_{i}\right]\)区间内(序列中的第\(L_{i}\)个字符到第\(R_{i}\)个字符)的括号全部翻转(左括号变成右括号,右括号变成左括号)。求出以\(L_{i}\)为左端点......
  • UVA - 10131 Is Bigger Smarter? 最长上升子序列
    题目大意:给出一系列大象的体重和IQ的数据,要求找出最长的一串,符合大象1的体重大于大象2,而IQ却小于大象2解题思路:设置一个状态量,d[i],表示以第i只大象为终点的符合条件的最大值,则如果符合大象i的体重大于大象j的体重,但IQ却反之且d[i] <d[j]+1,那么d[i] =d[j]+1#include<cst......
  • UVA - 10706 Number Sequence 子序列
    #include<cstdio>#include<cmath>#include<algorithm>usingnamespacestd;constintmaxn=32761;longlongS[maxn];//存放的是S1,S2,到SK的和,S[5]表示了S1到S4的和,当数字变化到K的时候,一共有多少个字数了intborder[9]={0,1,10,100,1000,10000,100000,1000000,10000000......
  • jackson序列化报 Null key for a Map not allowed in JSON (use a converting NullKey
    报错:"requestParam":null,"errorMsg":"org.springframework.http.converter.HttpMessageNotWritableException:CouldnotwriteJSON:NullkeyforaMapnotallowedinJSON(useaconvertingNullKeySerializer?);nestedexceptionisc......
  • JSON序列化和反序列化日期时间的处理
    JSON格式不直接支持日期和时间。DateTime值值显示为“/Date(700000+0500)/”形式的JSON字符串,其中第一个数字(在提供的示例中为700000)是GMT时区中自1970年1月1日午夜以来按正常时间(非夏令时)经过的毫秒数。该数字可以是负数,以表示之前的时间。示例中包括“+0500”的部分可选......
  • 火车进出栈序列问题
    火车进出栈序列问题一、枚举进出栈序列方案1到n的数字按照顺序入栈,请你按照字典序从小到大输出前20种可能的出栈方案\(1<=n<=20\)题解:\(dfs\)搜索看到数据范围很容易想到\(dfs\)爆搜枚举我们首先要维护3个状态:栈内的状态准备入栈的数字是什么已经出栈的序列对于每......
  • 遍历去重
    题目描述ZN想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请......
  • 1145. 二叉树着色游戏
    题目链接:1145.二叉树着色游戏方法:分类解题思路(1)\(x\)节点将二叉树分成了\(3\)部分,分别是父节点子树、左子树、右子树(节点数分别为n1n2n3);(2)为了使得二号玩家染色尽可能的多,应该让\(y\)选择在\(x\)相邻的节点。若存在以下一种情况,则二号玩家稳赢,n1>n2+n3+1||......