- 从前序与中序遍历序列构造二叉树
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
int len1 = preorder.length, len2 = inorder.length;
TreeNode root = create(preorder, 0, len1 -1, inorder, 0, len2 - 1);
return root;
}
TreeNode create(int[] pre, int l1, int r1, int[] in, int l2, int r2){
if(r1 < l1 || r2 < l2) return null;//递推边界不要忘了
int val = pre[l1];
TreeNode root = new TreeNode(val);
int k;
for(k = l2; k <= r2; k++){
if(in[k] == val) break;
}
//先确定k的值,关键在于要确定pre数组对应的位置,恰好为k - l2 + l1
root.left = create(pre, l1 + 1, k - l2 + l1, in, l2, k- 1);
root.right = create(pre, k - l2 + l1 +1, r1, in, k + 1, r2);
return root;
}
}
106. 从中序与后序遍历序列构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
int len1 = inorder.length, len2 = postorder.length;
TreeNode root = create(inorder, 0, len1 -1, postorder, 0, len2 - 1);
return root;
}
TreeNode create(int[] in, int l1, int r1, int[] post, int l2, int r2){
if(r1 < l1 || r2 < l2) return null;//递推边界不要忘了
int val = post[r2];
TreeNode root = new TreeNode(val);
int k;
for(k = l1; k <= r1; k++){
if(in[k] == val) break;
}
root.left = create(in, l1, k - 1, post, l2, k - 1 - l1 + l2);
root.right = create(in, k + 1, r1, post, k - l1 + l2, r2 - 1);
return root;
}
}