zoukankan      html  css  js  c++  java
  • LeetCode-面试题07-重建二叉树

    来源:力扣(LeetCode)- 面试题07

    问题

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

    例如,给出

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

        3
       / 
      9  20
        /  
       15   7
    

    二叉树结构

    public class TreeNode{
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x){ val = x; }
    }
    

    解答

    前序遍历特点:节点按照 [根节点|左子树|右子树] 排序

    中序遍历特点:节点按照 [左子树|根节点|右子树] 排序

    根据以上特点,可得重构二叉树的步骤:

    1. 前序遍历的第一个元素,是整个二叉树的根节点(root)的值。
    2. 在中序遍历中查询根节点(root)的索引,由此索引,可以划分中序遍历(左子树的右边界、右子树的左边界)
    3. 根据子树的左右边界可以确定子树的节点数量,进而划分前序遍历,可以确定左右子节点的值
    class Solution {
        public TreeNode buildTree(int[] preorder, int[] inorder) {
            HashMap<Integer,Integer> dic = new HashMap<>();//存放中序遍历 <值,索引> 键值对,便于查询根节点值的索引
            for(int i = 0; i < inorder.length; i++) 
                dic.put(inorder[i],i);
            return build(preorder,0,0,inorder.length-1,dic);
        }
        public TreeNode build(int[] preorder,int pre_root,int in_left,int in_right,HashMap<Integer,Integer> dic){
            if(in_left>in_right) return null;
            TreeNode root = new TreeNode(preorder[pre_root]);
            int i = dic.get(root.val);//获取根节点在 中序遍历 中的索引
            root.left = build(preorder,pre_root+1,in_left,i-1,dic);//获取左子节点
            root.right = build(preorder,pre_root+i-in_left+1,i+1,in_right,dic);//获取又子节点
            return root;
        }
    }
    

    执行用时:2ms

    内存消耗:40.1MB

  • 相关阅读:
    switch case加范围判断
    对requestAnimationFrame的一点理解
    用dos命令导出一个文件夹里面所有文件的名字(装逼利器)
    zookeeper基本知识入门(一)
    hadoop学习(七)----mapReduce原理以及操作过程
    centos虚拟机配置静态ip
    linux 配置ssh无密码登录不起作用的解决方案
    linux下安装开发环境
    hadoop学习(五)----HDFS的java操作
    hadoop学习(四)----windows环境下安装hadoop
  • 原文地址:https://www.cnblogs.com/HenuAJY/p/13164317.html
Copyright © 2011-2022 走看看