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

Posted 易小顺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了105. 从前序与中序遍历序列构造二叉树相关的知识,希望对你有一定的参考价值。

算法记录

LeetCode 题目:

  给定一棵树的前序遍历 preorder 与中序遍历 inorder。请构造二叉树并返回其根节点。



说明

一、题目

  Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
  Output: [3,9,20,null,null,15,7]

二、分析

  • 简单的根据前序和中序构建二叉树问题。
  • 因为二叉树的定义是递归的,所以其构建也可以是递归进行的。
  • 前序遍历的第一个节点肯定是当前需要构建二叉树的根节点,也就是可以先确定二叉树的根节点。
  • 而二叉树的中序遍历前半段是左子树的节点,右半段是右子树的节点,以根节点进行划分。
  • 就可以先将根节点构建出来,然后再根据中序遍历的节点划分来递归的创建该节点的左右子树。
  • 这里可以采用一个存储索引的方式来快速的找到根节点在中序遍历中的位置信息,方便定位到左右子树的方位区间。
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    private Map<Integer, Integer> index;
    public TreeNode build(int[] preorder, int preL, int preR, int[] inorder, int ordL, int ordR) {
        if(preL > preR) return null;
        TreeNode root = new TreeNode(preorder[preL]);
        int pos = index.get(preorder[preL]);
        int len = pos - ordL;
        root.left = build(preorder, preL + 1, preL + len, inorder, ordL, pos - 1);
        root.right = build(preorder, preL + 1 + len, preR, inorder, pos + 1, ordR);
        return root;
    }
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        index = new HashMap();
        for(int i = 0; i < inorder.length; i++)
            index.put(inorder[i], i);
        return build(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
    }
}

总结

熟悉根据二叉树的前序遍历和中序遍历还原二叉树的方法。

以上是关于105. 从前序与中序遍历序列构造二叉树的主要内容,如果未能解决你的问题,请参考以下文章

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

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

LeetCode第105题—从前序与中序遍历序列构造二叉树—Python实现

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

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

刷题-力扣-105. 从前序与中序遍历序列构造二叉树