zoukankan      html  css  js  c++  java
  • 【剑指 Offer】07.重建二叉树

    题目描述

    输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

    示例:
    前序遍历 preorder = [3,9,20,15,7]
    中序遍历 inorder = [9,3,15,20,7]
    返回如下的二叉树:
    3
    /
    9 20
    /
    15 7

    限制:
    0 <= 节点个数 <= 5000

    Java

    public class Solution07 {
        public static void main(String[] args) {
            int[] preorder = {3, 9, 20, 15, 7};
            int[] inorder = {9, 3, 15, 20, 7};
            Solution07 s = new Solution07();
            TreeNode t = s.buildTree(preorder, inorder);
            System.out.println(t);
        }
    
        /**
         * 方法一:递归重建
         * 从前序遍历中找到根节点位置,然后得到其左右子树,最后递归重建
         */
        int [] preorder;
        HashMap<Integer, Integer> map = new HashMap<>();
        public TreeNode buildTree(int[] preorder, int[] inorder) {
            this.preorder = preorder;
            for (int i = 0; i < inorder.length; ++i) {
                map.put(inorder[i], i);
            }
    
            return reBuild(0, 0, inorder.length - 1);
        }
    
        public TreeNode reBuild(int root, int left, int right) {
            if (left > right) {
                return null;
            }
    
            TreeNode node = new TreeNode(preorder[root]);   // 建立根节点
            int i = map.get(preorder[root]);    // 划分根节点、左右子树
            node.left = reBuild(root + 1, left, i - 1);
            node.right = reBuild(root + 1 + i - left, i + 1, right);
            return node;
        }
    }
    
    
    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x) {
            val = x; 
        }
    
        @Override
        public String toString() {
            return "TreeNode [" + (left != null ? "left=" + left + ", " : "")
                    + (right != null ? "right=" + right + ", " : "") + "val=" + val + "]";
        }
    }
    

    C++

    
    

    Python

    
    

    总结

  • 相关阅读:
    MVC应用程序使用Entity Framework
    @Styles的nameSpace是什么
    创建第一个MVC应用程序
    计算DataTable某列的值(SUM)
    DropDownList 控件的SelectedIndexChanged事件触发不了
    在类中使用Response.Redirect()方法
    控制某个panel的display样式
    获取指定日期下个月份的第一天
    字符串如何还原为中文
    判断字符串中包含3个连续(升、降)或相同的数字
  • 原文地址:https://www.cnblogs.com/parzulpan/p/14221377.html
Copyright © 2011-2022 走看看