如果是构造二叉树,就优先考虑用前序遍历,先处理根节点再处理左右节点,然后三部曲第一确定返回值类型和参数列表,构造二叉树一定是返回treenode,参数列表就是数组,终止条件是因为数组大小大于等于1,因此当数组大小等于1时,return new TreeNode(val);中间逻辑,
for(int i=start;i<end;i++){
if(num[i]>max){
max=num[i];
index=i;
}
}
TreeNode root=new TreeNode(max);
root.left=dfs(num,start,index);
root.right=dfs(num,index+1,end);
return root;
因为终止条件为数组条件等于1时,所以只有当index>=1才能构建左子树,当end-index大于等于一才能构建右子树
这道题主要是同时操作两个二叉树,我的思路是返回值是treenode,参数列表也是两个treenode,
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if(root1==null&&root2==null){
return null;
}
TreeNode root=new TreeNode();
if(root1==null&&root2!=null){
root=new TreeNode(root2.val);
root.left=mergeTrees(root1,root2.left);
root.right=mergeTrees(root1,root2.right);
}
else if(root2==null&&root1!=null){
root=new TreeNode(root1.val);
root.left=mergeTrees(root1.left,root2);
root.right=mergeTrees(root1.right,root2);
}
else{
root=new TreeNode(root1.val+root2.val);
root.left=mergeTrees(root1.left,root2.left);
root.right=mergeTrees(root1.right,root2.right);
}
return root;
}
}
就是将将两个根节点相加,然后分别构建左子树(两个根节点的左子树)和右子树(两个根节点的右子树)然后考虑终止条件(节点为null)的处理方法,卡哥的代码更简洁,终止条件(第一个节点为空就返回第二个节点)第二个节点为空就返回第一个节点,即发现有一个节点为空就把另一个节点直接迁移过来了,我是要把所有节点遍历并相加,显得更臃肿。
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if(root==null){
return null;
}
if(root.val==val){
return root;
}
TreeNode left=searchBST(root.left,val);
TreeNode right=searchBST(root.right,val);
if(left==null&&right==null){
return null;
}
return left==null?right:left;
}
}
我的代码看起来简洁,但是其实没考虑到BST的特性,我是在递归的过程中把整个树搜素了一遍,来查找是否存在对应值,但是应该利用BST的特性的,如果值小于根节点的值就搜索左边,大于搜索右子树,我选择遍历整个树是考虑到可能一个值小于跟,但是它可能等于右子树的左子树的值,但是我这样想是错误的,如果这样的话,BST是会发生变化的,如果想找比根节点小的树就从左子树找,别找右子树。