617. 合并二叉树https://leetcode.cn/problems/merge-two-binary-trees/
给你两棵二叉树: root1 和 root2 。
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。
返回合并后的二叉树。
注意: 合并过程必须从两个树的根节点开始。
示例 1:
输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]
输出:[3,4,5,5,4,null,7]
示例 2:
输入:root1 = [1], root2 = [1,2]
输出:[2,2]
第一想法还是我比较熟悉的递归思路,两棵树的结合的特别之处只是在于一个树有的节点,另一个没有,所以终止条件会有所区别。来考虑下递归的三要素。
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if (root1 == null && root2 == null)
return null;
int val1 = 0, val2 = 0;
TreeNode left1 = null, left2 = null, right1 = null, right2 = null;
if (root1 != null) {
val1 = root1.val;
left1 = root1.left;
right1 = root1.right;
}
if (root2 != null) {
val2 = root2.val;
left2 = root2.left;
right2 = root2.right;
}
TreeNode root = new TreeNode(val1 + val2);
root.left = mergeTrees(left1, left2);
root.right = mergeTrees(right1, right2);
return root;
}
}
700. 二叉搜索树中的搜索https://leetcode.cn/problems/search-in-a-binary-search-tree/
给定二叉搜索树(BST)的根节点 root 和一个整数值 val。
你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。
示例 1:
输入:root = [4,2,7,1,3], val = 2
输出:[2,1,3]
示例 2:
输入:root = [4,2,7,1,3], val = 5
输出:[]
这道题只是考察是否掌握二叉搜索树的定义和搜索,只需要从根节点一路循环下去,找到了就返回,如果循环完都没找到就返回null。
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
while (root != null) {
if (root.val == val)
return root;
else if (root.val > val)
root = root.left;
else
root = root.right;
}
return null;
}
}
98. 验证二叉搜索树https://leetcode.cn/problems/validate-binary-search-tree/
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
示例 1:
输入:root = [2,1,3]
输出:true
示例 2:
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。
验证二叉搜索树也就是对所有节点进行一个遍历,同时进行一个判断,对每一个节点来说,左右子树是二叉搜索树,并且大于左子树的值小于右子树的值,就满足二叉搜索树的定义。
这个思路是可以进行递归的,所以考虑递归的三要素进行递归实现:
class Solution {
TreeNode max;
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
// 左
boolean left = isValidBST(root.left);
if (!left) {
return false;
}
// 中
if (max != null && root.val <= max.val) {
return false;
}
max = root;
// 右
boolean right = isValidBST(root.right);
return right;
}
}