一、算法题
654.最大二叉树
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
if(nums.length==0){
return null;
}
return maxtree(nums,0,nums.length);
}
public TreeNode maxtree(int[] nums,int leftIndex,int rightIndex){
if(leftIndex>=rightIndex){
return null;
}
int max=Integer.MIN_VALUE;
int maxIndex=0;
//找到数组中最大值
for (int i = leftIndex; i < rightIndex; i++) {
if(nums[i]>max){
max=nums[i];
maxIndex=i;
}
}
TreeNode root=new TreeNode(max);
root.left=maxtree(nums, leftIndex, maxIndex);
root.right=maxtree(nums, maxIndex+1, rightIndex);
return root;
}
}
- 终止条件
if(leftIndex>=rightIndex){ return null; }
- 不能用判断数组长度来作为终止条件,因为数组是不变的,改变的是我们传入的下标,它只会通过下标取对应的数组元素
- 取等于是因为当左右下标相同时
- 不可能出现一开始就左右下标相同的情况,因为一开始leftIndex=0且rightIndex=0,这样只有空数组才有这样的情况。不可能传入空数组,因为一开始就判断了,所以出现左右下标相同一定是在递归过程中出现的
- 因为leftIndex其实一直是0,当rightIndex(在递归过程中其实是maxIndex)与leftIndex相等时,说明最左边的元素就是最大的元素,这个最大元素在上一层递归中就已经被new成结点的了,所以返回null退出此次循环
- 遍历树一般想到前序遍历
617.合并二叉树
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if(root1==null){
return root2;
}
if(root2==null){
return root1;
}
root1.val+=root2.val;
root1.left=mergeTrees(root1.left, root2.left);
root1.right=mergeTrees(root1.right, root2.right);
return root1;
}
}
- 在root1的基础上修改树
- 同时操作两个树就同时传入两个树一起递归
700.二叉搜索树中的搜索
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if(root==null||root.val==val){
return root;
}
TreeNode left=searchBST(root.left, val);
if(left!=null){
//说明找到了
return left;
}
TreeNode right=searchBST(root.right, val);
if(right!=null){
//说明找到了
return right;
}
//左右结点都没找到
return null;
}
}
98.验证二叉搜索树
class Solution {
long maxvalue=Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if(root==null){
return true;
}
boolean left=isValidBST(root.left);
if(root.val>maxvalue){
maxvalue=root.val;
}
else{
//此时root.val<maxvalue,也就是出现了中间结点的值比左子节点的值要小的情况
return false;
}
boolean right=isValidBST(root.right);
return left&&right;
}
}
- 遇到搜索树要想到中序遍历
- maxvalue要定义在isValidBST外
- 不然每次递归遇到的maxvalue全是重新定义的,等于Long.MIN_VALUE的值
- 这样什么情况都会返回true
- 这里的root.val其实是根据中序遍历的左中右顺序的结点的值,maxvalue是它按这个顺序的上一个的值,所以如果是搜索树的话,每次递归的结点的值要比上一次递归取到的最大值要大
if(root.val>maxvalue){ maxvalue=root.val; }
- 比如[2,1,3]
- root.val=1,大于maxvalue初始值,此时更新maxvalue=1
- root.val=2,大于maxvalue,此时更新maxvalue=2
- root.val=3,大于maxvalue,此时更新maxvalue=3
- 所以最后返回true