根据前序和后序遍历构造二叉树

在leetcode上做题刚好做到一题:根据前序和后序遍历构造二叉树。在我们一般构建二叉树时,一般是根据中序和前序或者后序构建二叉树。根据前序和后序构建的二叉树不一定是唯一的。

889. 根据前序和后序遍历构造二叉树
返回与给定的前序和后序遍历匹配的任何二叉树。
pre 和 post 遍历中的值是不同的正整数。

不多说,上代码:

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
public TreeNode constructFromPrePost(int[] pre, int[] post) {
if (pre.length <= 0) {
return null;
}
return constructFromPrePostHelper(pre, post, 0, 0, post.length - 1);
}

private TreeNode constructFromPrePostHelper(int[] pre, int[] post, int flag, int postStart, int postEnd) {
if (flag >= pre.length || postStart > postEnd) {
return null;
} else if (flag < pre.length && postStart == postEnd) {//判断没有子树的节点
return new TreeNode(pre[flag]);
}
int mid = postStart;
//判断左右子树的分隔点
if (flag + 1 < pre.length) {
for (; mid < postEnd; mid++) {
if (post[mid] == pre[flag + 1]) {
break;
}
}
}
TreeNode node = new TreeNode(pre[flag]);
node.left = constructFromPrePostHelper(pre, post, flag + 1, postStart, mid);
node.right = constructFromPrePostHelper(pre, post, flag + mid - postStart + 2, mid + 1, postEnd - 1);
return node;
}

public class TreeNode {
int val;
TreeNode left;
TreeNode right;

TreeNode(int x) {
val = x;
}
}

测试用例:
输入:pre [1,2,4,5,3,6,7], post [4,5,2,6,7,3,1]
输出:[1, 2, 3, 4, 5, 6, 7]

原理:
在通过递归的方式,每次找到分隔点,构建左右子树的方式,在其中主要需要判断最终一个没有子树的节点判断。