LeetCode - 617. 合并二叉树
解题思路:这道题运用前序遍历比较直观。 终止条件就是当其中一棵树的root为空时,返回另一棵树的根节点,如果都不为空就相加,如果都为空也就是返回null。为了方便,这道题是基于root1来作修改,最后直接返回root1。
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
// 终止条件
if (root1 == null) return root2;
if (root2 == null) return root1;
// 单层递归
if (root1 != null && root2 != null) {
root1.val += root2.val;
}
root1.left = mergeTrees(root1.left, root2.left);
root1.right = mergeTrees(root1.right, root2.right);
return root1;
}
}
LeetCode - 700. Search in a Binary Search Tree 二叉搜索树中的搜索
解题思路:这题在搜索二叉树的基础上需要按照二叉搜索树的特性来搜索,如果target是大于当前节点值,那么目标值一定在右子树,这样只需要向右搜索就行了,反之同理。
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if (root == null || root.val == val) return root;
if (root.val > val) {
return searchBST(root.left, val);
}
if (root.val < val) {
return searchBST(root.right, val);
}
return null;
}
}
LeetCode - 98. 验证二叉搜索树
二叉搜索树的另一个特性:就是当我们用中序遍历搜索二叉树的时候,元素是从小到大排序的。利用这个特性,我们在中序遍历搜索二叉树的过程中就可以验证是否每个元素是单调递增的了。
在第一次写递归法的时候想法特别简单,在写判断条件的时候容易陷入一个误区,我们在判断当前节点大于左节点并且小于右节点时就返回true,但其实二叉搜索树的特性是根节点的值应该是比所有左/右子树的值大/小的。因为二叉树应该是和整体的根节点来比较的,这样的判断条件只能证明当前遍历到的某个子树满足了二叉搜索树的特性,但不能保证整体是一个二叉搜索树。
因此在做这道题的时候需要一个全局变量来记录前一个节点,这样在每一次遍历的时候检查是否每次都比这个maxValue来的大,如果当前值小于或等于这个最大值那么证明不是二叉搜索树。
class Solution {
TreeNode max;
public boolean isValidBST(TreeNode root) {
if (root == null) return true;
//left
boolean leftIsBST = isValidBST(root.left);
//middle
if (max != null && root.val <= max.val) {
return false;
}
max = root;
//right
boolean rightIsBST = isValidBST(root.right);
return leftIsBST && rightIsBST;
}
}

被折叠的 条评论
为什么被折叠?



