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