Construct Binary Tree from Preorder and Inorder Traversal
递归解法
思路
1
/ \
2 3
/ \ / \
4 5 6 7
对于上图的树来说,
index: 0 1 2 3 4 5 6
先序遍历为: 1 2 4 5 3 6 7
中序遍历为: 4 2 5 1 6 3 7
1. 先序遍历的第一个节点为根节点。
2. 中序遍历中根节点是左子树右子树的分割点。
所以这道题可以用递归的方法解决。
通过先序遍历找到第一个点作为根节点,在中序遍历中找到根节点并记录index。此处用hashmap来存储, key为中序遍历节点值 value为index
因为中序遍历中根节点左边为左子树,所以可以记录左子树的长度并在先序遍历中依据这个长度找到左子树的区间,用同样方法可以找到右子树的区间。
递归的建立好左子树和右子树就好。
复杂度
时间O(n) 空间用了一个map 为O(n)
代码
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder == null || inorder == null || preorder.length == 0 || inorder.length == 0 || preorder.length != inorder.length) {
return null;
}
int len = preorder.length;
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < len; i++) {
map.put(inorder[i], i);
}
return helper(preorder, 0 , len - 1, inorder, 0, len - 1, map);
}
public TreeNode helper(int[] preorder, int pstart, int pend, int[] inorder, int istart, int iend, HashMap<Integer, Integer> map) {
if (pstart > pend || istart > iend) {
return null;
}
TreeNode root = new TreeNode(preorder[pstart]);
int index = map.get(root.val);
root.left = helper(preorder, pstart + 1, pstart + index - istart, inorder, istart, index - 1, map);
root.right = helper(preorder, pstart + index - istart + 1, pend, inorder, index + 1, iend, map);
return root;
}
Construct Binary Tree from Inorder and Postorder Traversal
递归解法
复杂度
时间O(n) 空间用了一个map 为O(n)
代码
public TreeNode buildTree(int[] inorder, int[] postorder) {
int len = inorder.length;
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < len; i++) {
map.put(inorder[i], i);
}
return helper(inorder, 0, len - 1, postorder, 0 , len - 1, map);
}
public TreeNode helper(int[] inorder, int istart, int iend, int[] postorder, int pstart, int pend, HashMap<Integer, Integer> map) {
if (istart > iend || pstart > pend) {
return null;
}
TreeNode root = new TreeNode(postorder[pend]);
int index = map.get(root.val);
root.left = helper(inorder, istart, index - 1, postorder, pstart, pstart + index - istart - 1, map);
root.right = helper(inorder, index + 1, iend, postorder, pstart + index - istart, pend - 1, map);
return root;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。