代码随想录刷题记录day18之 最大二叉树+合并二叉树+搜索二叉搜索树中的值+验证二叉树
参考:代码随想录
654. 最大二叉树
思想
和昨天的根据中序后序构造二叉树 、 根据前序中序构造二叉树的题目很像
按照题目中的描述的思路来写代码就好了
代码
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
return binaryTree(nums);
}
public TreeNode binaryTree(int[] nums){
if(nums.length==0){
return null;
}
//单层递归逻辑
//找到nums的最大值 根据最大值去切分 左子树和右子树
int maxValueIndex=0;
int maxValue=0;
for(int i=0;i<nums.length;i++){
if(nums[i]>maxValue){
maxValue=nums[i];
maxValueIndex=i;
}
}
// System.out.println("最大值:"+maxValue);
// System.out.println("最大值下标:"+maxValueIndex);
TreeNode root=new TreeNode(maxValue);
//切分左子树和右子树
int [] leftNums=Arrays.copyOfRange(nums,0,maxValueIndex);
// System.out.println(Arrays.toString(leftNums));
int [] rightNums=Arrays.copyOfRange(nums,maxValueIndex+1,nums.length);
// System.out.println(Arrays.toString(rightNums));
root.left=binaryTree(leftNums);
root.right=binaryTree(rightNums);
return root;
}
}
617. 合并二叉树
思想
刚开始想不到终止条件是啥,看了视频才知道。
终止条件: 当node1为空的时候 返回node2;当node2为空的时候返回node1
那node1和node2都为空的时候呢? 其实已经包含进去了,都为空 返回null
单层递归的逻辑:
这是后node1和node2都不为空了 执行相加的操作即可
代码
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
//采用前序遍历
return merge(root1,root2);
}
public TreeNode merge(TreeNode node1,TreeNode node2){
//递归的终止条件
if(node1==null) return node2;
if(node2==null) return node1;
//代码执行到这一步 肯定是两个节点都不为空的情况了
TreeNode root=new TreeNode(node1.val+node2.val);
root.left=merge(node1.left,node2.left);//数值可以和null 相加吗?
root.right=merge(node1.right,node2.right);
return root;
}
}
700. 二叉搜索树中的搜索
思想
自己没想到二叉搜索树的特性。刚开始用前序遍历去做这道题目了,可能递归的次数会多一点。
其实根据二叉搜索树的特性,中序遍历时能够从小到大遍历的
注意时返回值
代码
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);
// if(left!=null) return left;
// TreeNode right=searchBST(root.right,val);
// if(right!=null) return right;
// return null;
// }
public TreeNode searchBST(TreeNode root, int val) {
//递归终止条件
if(root==null) return null;
//单层递归逻辑
//中序遍历
TreeNode left=searchBST(root.left,val);
if(left!=null) return left;
if(root.val==val) return root;
TreeNode right=searchBST(root.right,val);
if(right!=null) return right;
return null;
}
}
98. 验证二叉搜索树
思想
这道题目对我来说比较难,没有想到怎么做。
总体思路如下:
首先是根据二叉搜索树的特性 进行中序遍历,维护一个指针指向前一个节点,通过比较前一个节点的值和当前节点的值,来判断是否是符合条件的。
终止条件:
节点为空的时候返回值是什么呢?true 为什么? 因为空节点是二叉搜索树
单层递归的逻辑
需要特殊处理第一个节点,遍历到第一个节点是, pre为空 这时候无法比较,if内的逻辑不执行,直接将当前节点的值赋值给pre
代码
class Solution {
TreeNode pre=null;
public boolean isValidBST(TreeNode root) {
//递归终止条件 是父节点
if(root==null) return true;//空节点 是二叉搜索树
//单层递归的逻辑 根据二叉搜索树的特性 中序遍历 是单调递增的
//左的逻辑
boolean left=isValidBST(root.left);
//双指针法 用一个 TreeNode 去记录前一个的节点
if(pre!=null && root.val<=pre.val){
//这里的处理 把第一个节点考虑进去了
//第一个节点 pre为null 就不会进展这里的判断
//当时第二个节点的时候才开始进行判断
return false;
}
pre=root;
boolean right=isValidBST(root.right);
return left&&right;
}
}