算法刷题Day17 - 二叉树Part5|617.合并二叉树|700.二叉搜索树中的搜索|98.验证二叉搜索树

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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值