LeetCode 889. 根据前序和后序遍历构造二叉树
题目描述
思路分析
我们可以利用前序遍历和后序遍历的特点来构造二叉树:
- 前序遍历的第一个元素是根节点。
- 后序遍历的最后一个元素是根节点。
- 前序遍历的第二个元素是左子树的根节点。
- 后序遍历中左子树的根节点的位置可以帮助我们确定左子树的范围。
通过递归的方法,我们可以不断地分割前序和后序数组来构造二叉树。
在代码中,
L
变量用于找到左子树的根节点在后序遍历中的位置。我们需要加1
的原因是:
- 在后序遍历中,左子树的根节点的位置是
i
,而左子树的范围是从0
到i
。- 因此,左子树的长度是
i + 1
,我们需要在前序遍历中取出前i + 1
个元素来构造左子树。
参考代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func constructFromPrePost(preorder []int, postorder []int) *TreeNode {
if len(preorder) <= 0 || len(postorder) <= 0 {
return nil
}
root := &TreeNode{Val: preorder[0]}
// 非常重要
if len(preorder) == 1 {
return root
}
// L 变量用于找到左子树的根节点在后序遍历中的位置
L := 0
for i := range postorder {
if postorder[i] == preorder[1] {
L = i + 1
break
}
}
root.Left = constructFromPrePost(preorder[1:L+1], postorder[:L])
root.Right = constructFromPrePost(preorder[L+1:], postorder[L:len(postorder)-1])
return root
}
1
write your code here
1
write your code here
CC BY-NC-SA 4.0
许可协议,转载请注明出处!
本博客所有文章除特别声明外,均采用