105:从前序和中序构建二叉树
题干:
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
解题思路:先从前序遍历中找到树的根节点,在递归计算左右子树
public class Solution {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder.length == 0 || inorder.length ==0){
return null;
}
return helper(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
}
public TreeNode helper(int[] preorder, int pre_start, int pre_end, int[] inorder, int in_start, int in_end){
if (pre_start > pre_end || in_start > in_end){
return null;
}
int root_val = preorder[pre_start];
TreeNode root = new TreeNode(root_val);
for (int i = in_start; i <= in_end; i++){
if (root_val == inorder[i]){
root.left = helper(preorder, pre_start + 1, pre_start + i - in_start, inorder, in_start, i - 1);
root.right = helper(preorder, pre_start + 1 + i - in_start, pre_end, inorder, i + 1, in_end);
}
}
return root;
}
}
106:从中序遍历和后序遍历中确定二叉树
题干:
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
和上题解题思路基本一样
public class Solution {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public TreeNode buildTree(int[] inorder, int[] postorder) {
if (inorder.length == 0 || postorder.length == 0){
return null;
}
return helper(inorder, 0, inorder.length - 1, postorder, 0, postorder.length - 1);
}
public TreeNode helper(int[] inorder, int in_start, int in_end, int[] postorder, int post_start, int post_end){
if (in_start > in_end || post_start > post_end){
return null;
}
TreeNode root = new TreeNode(postorder[post_end]);
//从后序遍历中找到根节点
for (int i = in_start; i <= in_end; i++){
if (inorder[i] == postorder[post_end]){
root.left = helper(inorder, in_start, i - 1, postorder, post_start, post_start + i - in_start - 1);
root.right = helper(inorder, i + 1, in_end, postorder, post_start + i - in_start, post_end - 1);
}
}
return root;
}
}