写点什么

【LeetCode】从前序与中序遍历序列构造二叉树 Java 题解

用户头像
HQ数字卡
关注
发布于: 5 小时前

题目描述

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


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


例如,给出
前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树:
3 / \ 9 20 / \ 15 7
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码

思路分析

  • 这个题目题意容易理解,是树的遍历的综合应用题目。

  • 根据二叉树的遍历的定义,首先使用前序遍历确定根的位置,然后在中序遍历中查找根的位置索引,在减去中序遍历的左节点位置,从而确定左子树的长度。

  • 在前序遍历中,确定了根节点之后,根节点之后左子树的长度就是左子树。在中序遍历中,从左节点开始,到根节点位置索引减一就是左子树。

  • 在前序遍历中,左子树的位置加一,到右节点,就是右子树。在中序遍历中,根节点索引位置加一,到右节点,就是右子树。

代码

/** * 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 {    public TreeNode buildTree(int[] preorder, int[] inorder) {        int n = preorder.length;        int preOrderLeft = 0;        int preOrderRight = n - 1;        int inOrderLeft = 0;        int inOrderRight = n - 1;
TreeNode ans = helper(preorder, preOrderLeft, preOrderRight, inorder, inOrderLeft, inOrderRight); return ans; }
public TreeNode helper(int[] preOrder, int preOrderLeft, int preOrderRight, int[] inOrder, int inOrderLeft, int inOrderRight) { if (preOrderLeft > preOrderRight) { return null; } int rootVal = preOrder[preOrderLeft]; int inOrderRootIndex = 0; for (int i = 0; i < inOrder.length; i++) { if (rootVal == inOrder[i]) { inOrderRootIndex = i; break; } }
int leftSubTreeLength = inOrderRootIndex - inOrderLeft;
TreeNode root = new TreeNode(rootVal);
root.left = helper(preOrder, preOrderLeft + 1, preOrderLeft + leftSubTreeLength, inOrder, inOrderLeft, inOrderRootIndex - 1); root.right = helper(preOrder, preOrderLeft + leftSubTreeLength + 1, preOrderRight, inOrder, inOrderRootIndex + 1, inOrderRight);
return root; }}
复制代码

总结

  • 上述解法的时间复杂度是 O(n), 空间复杂度是 O(1)

  • 递归的时候一定要写递归的终止条件,确保程序的安全运行。

  • 坚持每日一题,加油!

发布于: 5 小时前阅读数: 3
用户头像

HQ数字卡

关注

还未添加个人签名 2019.09.29 加入

LeetCode,略懂后端的RD

评论

发布
暂无评论
【LeetCode】从前序与中序遍历序列构造二叉树Java题解