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

从中序与后序遍历序列构造二叉树

根据一棵树的中序遍历与后序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

中序遍历 inorder = [9,3,15,20,7]

后序遍历 postorder = [9,15,7,20,3]

返回如下的二叉树:

3

/

9 20

/

15 7

解题思路:

已知中序遍历和后序遍历IN和Post,求还原二叉树。

后序遍历的最后一个数post[len-1]就是root节点。

搜索IN,如果IN[I]=post[len-1],那么 IN[I+1]-IN[len-1]就是root的右子树,IN[0]-IN[I-1]就是root的左子树。

通过递归求解。

 1 public class Solution{
 2     public TreeNode buildTree(int[] inorder,int[] postorder){
 3         return build(postorder.length-1,0,inorder.length-1,inorder,postorder);
 4     }
 5
 6     private TreeNode build(int poststart,int instart,int inend,int[] inorder,int[] postorder){
 7         if(poststart<0 || instart>inend){
 8             return null;
 9         }
10         TreeNode root=new TreeNode(postorder[poststart]);
11         int inindex=0;
12         for(int i=instart;i<=inend;i++){
13             if(inorder[i]==root.val){
14                 inindex=i;
15                 break;
16             }
17         }
18         root.right=build(poststart-1,inindex+1,inend,inorder,postorder);
19         root.left=build(poststart-(inend-inindex)-1,instart,inindex-1,inorder,postorder);
20         return root;
21     }
22 }

原文地址:https://www.cnblogs.com/kexinxin/p/10163095.html

时间: 2024-08-08 15:51:03

Leetcode 106.从中序与后序遍历序列构造二叉树的相关文章

【2】【leetcode-105,106】 从前序与中序遍历序列构造二叉树,从中序与后序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树 (没思路,典型记住思路好做) 根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / 9 20 / 15 7 链接:https://www.nowcoder.com/questionTerminal/0ee054a8767c4a6c96ddab65e08688f4来源:牛客

LeetCode | 0106. Construct Binary Tree from Inorder and Postorder Traversal从中序与后序遍历序列构造二叉树【Python】

LeetCode 0106. Construct Binary Tree from Inorder and Postorder Traversal从中序与后序遍历序列构造二叉树[Medium][Python][二叉树][递归] Problem LeetCode Given inorder and postorder traversal of a tree, construct the binary tree. Note: You may assume that duplicates do not

通过二叉树的中序和后序遍历序列构造二叉树(非递归)

题目:通过二叉树的中序和后序遍历序列构造二叉树 同样,使用分治法来实现是完全可以的,可是在LeetCode中运行这种方法的代码,总是会报错: Memory Limit Exceeded ,所以这里还是用栈来实现二叉树的构建. 与用先序和后序遍历构造二叉树的方法类似,但还是要做一些改变: 如果从后往前处理中序和后序的序列,则处理就为如下所示的情况: Reverse_Post: 根-右子树-左子树 Reverse_In: 右子树-根-左子树 这样处理方式和先序-中序就差不多了,只是将添加左孩子的情况

[98]验证二叉搜索树&amp;[105]从前序与中序遍历序列构造二叉树

扯闲话时间...很长一段时间没有刷题了,因为工作做得一团糟,惨遭领导怒批,心理压力大得一批导致工作时间特别长又没产出,所以刷题就搁置了... (小声BB)其实感觉领导有点刀子嘴豆腐心,一面说着"公司没义务从零培养新人,我自己也很久不带新人了",一面又给我讲了好多基础知识... 好了,言归正传,今天分享两道题,同类型的,力扣(leetcode中国)给的标签都是深度优先搜索,但是我都没想出来怎么用深度优先,所以都采用了递归. 这里提一句,曾经有位前辈和我说实际工作中递归并不常用,因为递归长

LeetCode105. 从前序与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树 描述 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 示例 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / 9 20 / 15 7 思路 一颗二叉树,对于前序遍历来说,其第一个元素一定是这棵树的根节点.在中序遍历中找到这个元素所在的位置,那么它的左半部分就是其左子树,右半部分就是其右子树. 重复上述过程, 通过

第106题:从中序与后序遍历序列构造二叉树

一. 问题描述 根据一棵树的中序遍历与后序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: 3 / \ 9  20 /  \ 15   7 二. 解题思路 本题思路:采用中序和后序遍历的特性进行求解,跟第105题几乎完全相同,只是把前序第一个必定是根节点,改成后序最后一个必定是根节点这点区别,没啥说的,具体可看第105题. 三. 执行结果

【leetcode 106. 从中序与后序遍历序列构造二叉树】解题报告

前往 中序,后序遍历构造二叉树, 中序,前序遍历构造二叉树 TreeNode* build(vector<int>& inorder, int l1, int r1, vector<int>&postorder, int l2, int r2) { if (l1>r1) return nullptr; int x = postorder[r2], i = 0; // 确定当前根节点 for (i = l1; i <= r1 && inor

[LeetCode系列] 从中序遍历和后序遍历序列构造二叉树(迭代解法)

给定中序遍历inorder和后序遍历postorder, 请构造出二叉树. 算法思路: 设后序遍历为po, 中序遍历为io. 首先取出po的最后一个节点作为根节点, 同时将这个节点入stn栈; 随后比较io的最后一个节点和stn栈顶节点: 如果不同则将此节点添加到栈顶节点的右侧并入stn栈, 同时从po中删除这个节点; 此时的栈中保存了所有还未处理左子树的右侧根节点 出现一次不同, 右侧子树的深度就增加1, 栈的深度就代表了当前右侧子树的深度 如果相同, 先缓存栈顶节点, 分别删除io和栈顶元素

【leetcode 105. 从前序与中序遍历序列构造二叉树】解题报告

前往 中序,后序遍历构造二叉树, 中序,前序遍历构造二叉树 TreeNode* build(vector<int>& preorder, int l1, int r1, vector<int>& inorder, int l2, int r2) { if (l1>r1) return nullptr; int x=preorder[l1], i=0; // 确定当前根节点 for(i=l2;inorder[i]!=x&&i<r2;++i)