zoukankan      html  css  js  c++  java
  • 剑指Offer-重建二叉树

    题目描述

    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

    思路

    前序遍历的第一个值为根节点的值,使用这个值将中序遍历结果分成两部分,左部分为树的左子树中序遍历结果,右部分为树的右子树中序遍历的结果,递归地去分别构建它的左右子树。

    代码实现

    package Tree;
    
    import java.util.HashMap;
    
    /**
     * 重建二叉树
     * 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
     */
    public class Solution54 {
        private HashMap<Integer, Integer> inOrderNumsIdx = new HashMap<>(); // 缓存中序遍历数组的每个值对应的索引
    
        public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
            for (int i = 0; i < in.length; i++) {
                inOrderNumsIdx.put(in[i], i);
            }
            return reConstructBinaryTree(pre, 0, pre.length - 1, in, 0, in.length - 1);
        }
    
        private TreeNode reConstructBinaryTree(int[] pre, int preL, int preR, int[] in, int inL, int inR) {
            if (preL == preR) return new TreeNode(pre[preL]);
            if (preL > preR || inL > inR) return null;
            // 创建当前根节点,并为根节点赋值
            TreeNode root = new TreeNode(pre[preL]);
            int inIdx = inOrderNumsIdx.get(root.val);
            int leftTreeSize = inIdx - inL;
            // 构建左子树
            root.left = reConstructBinaryTree(pre, preL + 1, preL + leftTreeSize, in, inL, inL + leftTreeSize - 1);
            // 构建右子树
            root.right = reConstructBinaryTree(pre, preL + leftTreeSize + 1, preR, in, inL + leftTreeSize + 1, inR);
            return root;
        }
    
        public class TreeNode {
            int val;
            TreeNode left;
            TreeNode right;
    
            TreeNode(int x) {
                val = x;
            }
        }
    }
    
    
  • 相关阅读:
    解析SparkStreaming和Kafka集成的两种方式
    不可不知的资源管理调度器Hadoop Yarn
    linux系统层面调优和常见的面试题
    OpenLayer加载百度坐标偏移问题解决(方案二)
    LeaFlet之GeoJson类介绍
    OpenLayer加载百度坐标偏移问题解决(方案一)
    LeaFlet迁徙图的制作
    OpenLayer4与mapV结合蜂巢图效果
    ArcGIS API For JS 实现右键菜单栏的功能
    OpenLayer4结合高德地图API实现交通态势的获取信息
  • 原文地址:https://www.cnblogs.com/wupeixuan/p/8884533.html
Copyright © 2011-2022 走看看