1,力扣105
给定两个整数数组 preorder
和 inorder
,其中 preorder
是二叉树的先序遍历, inorder
是同一棵树的中序遍历,请构造二叉树并返回其根节点。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
int p_len = preorder.length;
int i_len = inorder.length;
if(p_len==0||i_len==0){
return null;
}
TreeNode root = new TreeNode();
root.val = preorder[0];
int k = 0;
for(int i = 0;i<i_len;i++){
if(inorder[i]==root.val)
{ k = i;
break;
}//记得加括号
}
//有点繁琐但易于理解
int[] left_p = Arrays.copyOfRange(preorder,1,k+1);
int[] left_i = Arrays.copyOfRange(inorder,0,k);
root.left = buildTree(left_p,left_i);//构建左边的子树
int[] right_p = Arrays.copyOfRange(preorder,k+1,p_len);
int[] right_i = Arrays.copyOfRange(inorder,k+1,i_len);
root.right = buildTree(right_p,right_i);//构建右子树
return root;
}
}
2,力扣106
给定两个整数数组 inorder
和 postorder
,其中 inorder
是二叉树的中序遍历, postorder
是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
int i_len = inorder.length;//获取数组属性,注意length与length()的区别
int p_len = postorder.length;
if(i_len==0||p_len==0)
return null;
//找根节点
int rootValue = postorder[p_len-1];
TreeNode root = new TreeNode(rootValue);
//找中间节点
int k = 0;
for(int i=0;i<i_len;i++){
if(inorder[i]==rootValue){
k=i;
break;
}
}
//
int[] left_i = Arrays.copyOfRange(inorder,0,k);
int[] left_p = Arrays.copyOfRange(postorder,0,k);
root.left = buildTree(left_i,left_p);
int[] right_i = Arrays.copyOfRange(inorder,k+1,i_len);
int[] right_p = Arrays.copyOfRange(postorder,k,p_len-1);//前k个元素以及被取走,剩下的从第k个开始就是右子树的节点了
root.right = buildTree(right_i,right_p);
return root;
}
}