题目:105. 从前序与中序遍历序列构造二叉树
给定一棵树的前序遍历 preorder
与中序遍历 inorder
。请构造二叉树并返回其根节点。
难度:中等
示例 1:

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
示例 2:
Input: preorder = [-1], inorder = [-1]
Output: [-1]
提示:
1 <= preorder.length <= 3000
inorder.length == preorder.length
-3000 <= preorder[i], inorder[i] <= 3000
preorder
和 inorder
均无重复元素
inorder
均出现在 preorder
preorder
保证为二叉树的前序遍历序列
inorder
保证为二叉树的中序遍历序列
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
- 递归
- 迭代
解题代码
递归(参考官方解题代码)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { TreeNode root = buildTree(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1); return root; }
public TreeNode buildTree(int[] preorder, int[] inorder, int pre_left, int pre_right, int in_left, int in_right) { if (pre_left > pre_right) { return null; } TreeNode node = new TreeNode(preorder[pre_left]); int inorderRoot = in_left; while (inorderRoot <= in_right) { if (inorder[inorderRoot] == preorder[pre_left]) { break; } inorderRoot++; } int leftSubTree = inorderRoot - in_left; node.left = buildTree(preorder, inorder, pre_left + 1, pre_left + leftSubTree, inorderRoot - leftSubTree, inorderRoot - 1); node.right = buildTree(preorder, inorder, pre_left + leftSubTree + 1, pre_right, inorderRoot + 1, in_right); return node; } }
|
官方解题代码
迭代
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { if (preorder == null || preorder.length == 0) { return null; } TreeNode root = new TreeNode(preorder[0]); Deque<TreeNode> stack = new LinkedList<TreeNode>(); stack.push(root); int inorderIndex = 0; for (int i = 1; i < preorder.length; i++) { int preorderVal = preorder[i]; TreeNode node = stack.peek(); if (node.val != inorder[inorderIndex]) { node.left = new TreeNode(preorderVal); stack.push(node.left); } else { while (!stack.isEmpty() && stack.peek().val == inorder[inorderIndex]) { node = stack.pop(); inorderIndex++; } node.right = new TreeNode(preorderVal); stack.push(node.right); } } return root; } }
|