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

一. 问题描述

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

注意:

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

例如,给出

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

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

返回如下的二叉树:

3

/ \

9  20

/  \

15   7

二. 解题思路

本题思路:采用中序和后序遍历的特性进行求解,跟第105题几乎完全相同,只是把前序第一个必定是根节点,改成后序最后一个必定是根节点这点区别,没啥说的,具体可看第105题。

三. 执行结果

执行用时 :21 ms, 在所有 java 提交中击败了37.40%的用户

内存消耗 :51.4 MB, 在所有 java 提交中击败了8.79%的用户

四. Java代码

class Solution {
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        if(postorder.length>0) {
             TreeNode root =new TreeNode(postorder[postorder.length-1]);
             List<Integer> order=new ArrayList<Integer>();
             for(int i=0;i<inorder.length;i++) {
                 order.add(inorder[i]);
             }
             getTree(postorder,postorder.length-1,order,root);
             return root;
         } else {
             return null;
         }
    }
      public void getTree(int[]postorder ,int number,List<Integer> order,TreeNode root) {
        if(order.size()==1) {
            return ;
        }

        int ordernum=order.indexOf(postorder[number]);
        if(ordernum>0) {
        List<Integer> leftOrder=new ArrayList<Integer>(order.subList(0, ordernum));
        for(int i=number-1;i>=0;i--)
        {
            if(leftOrder.contains(postorder[i])) {
                root.left=new TreeNode(postorder[i]);
                getTree(postorder,i,leftOrder,root.left);
                break;
            }

         }
        }

        if(ordernum<order.size()-1)
        {
            List<Integer> rightOrder=new ArrayList<Integer>(order.subList(ordernum+1, order.size()));
            for(int j=number-1;j>=0;j--) {
                if(rightOrder.contains(postorder[j])) {
                    root.right=new TreeNode(postorder[j]);
                    getTree(postorder,j,rightOrder,root.right);
                    break;
                }
            }
        }

    }
}

原文地址:https://www.cnblogs.com/xiaobaidashu/p/11829126.html

时间: 2024-10-25 07:41:13

第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 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]-I

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 思路 一颗二叉树,对于前序遍历来说,其第一个元素一定是这棵树的根节点.在中序遍历中找到这个元素所在的位置,那么它的左半部分就是其左子树,右半部分就是其右子树. 重复上述过程, 通过

【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和栈顶元素

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

题目描述 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / 9 20 / 15 7 分析 这题剑指offer中出现过,虽然通过了,但是提交到leetcode上就特别差: 56 ms 75.9 MB 又看了别人的思路: (递归) O(n) 递归建立整棵二叉树:先递归创建左右子树,然后创建根节点,并让指针指向两