1.最大二叉树
题目要求是给一个数组,让最大的树当作根节点,建立一棵二叉树,题目要求是这样的
给定一个不重复的整数数组
nums。 最大二叉树 可以用下面的算法从nums递归地构建:
- 创建一个根节点,其值为
nums中的最大值。- 递归地在最大值 左边 的 子数组前缀上 构建左子树。
- 递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回
nums构建的 最大二叉树 。
这个题目和之前的前序构建二叉树,中序构建二叉树很是类似,都涉及到左右子树的切分 采用递归的方法解决这道题的递归步骤如下:
- 递归的找到最大值:
- 遍历数组进行比较
- 切割左右子树:
- 根据找到的最大值进行切割
周而复始,知道递归的nums长度成了0,表示这一个数组已经遍历完毕了
//这道题需要借助一个build函数完成对nums的切割
public TreeNode constructMaximumBinaryTree(int[] nums) {
if(nums.length == 0) return null;
return build(nums,0,nums.length - 1);
}
public TreeNode build(int[] nums,int start,int end){
if(start > end) return null;
//定义切割的位置和当前子树的最大值
int locale = -1,maxVal = Integer.MIN_VALUE;
// 遍历数组
for(int i = start,i <= end;i ++){
if(num[i] > maxVal){
maxVal = nums[i];
locale = i;
}
}
TreeNode root = new TreeNode(maxVal);
root.left = build(nums,start,locale - 1);
root.right = build(nums,locale + 1,end);
return root;
}
2.合并二叉树
递归的合并到root1上,如果root1是空,按照合并结果应当返回root2,如果都不为空,则将root1的val加上root2的val,然后返回root1
3.二叉搜索树中的搜索
直接二分遍历,大比较右子树,小比左子树
4.验证二叉搜索树
这道题需要注意一下,在刚开始写的时候总是想着只要左子树的值小于跟节点,使用record不断更新判断,但是这样想是错误的,比如这种情况
所以要直接将根节点与最小值和最大值相比较
public boolean isValidBST(TreeNode root) {
return isValidBST(root,null,null);
}
boolean isValidBST(TreeNode root,TreeNode min,TreeNode max){
if(root == null){
return true;
}
if(min != null && root.val <= min.val) return false;
if(max != null && root.val >= max.val) return false;
return isValidBST(root.left,min,root) && isValidBST(root.right,root,max);
}