代码随想录算法训练营第十七天(二叉树篇)|617. 合并二叉树, 700. 二叉搜索树中的搜索,98. 验证二叉搜索树

本文介绍了如何在LeetCode上解决二叉树相关问题,包括合并两个二叉树的递归算法,以及在二叉搜索树中搜索和验证的两种方法,包括递归和迭代。还提到验证二叉搜索树的关键在于检查中序遍历数组的单调性。
摘要由CSDN通过智能技术生成

617 合并二叉树

题目链接:617. 合并二叉树 - 力扣(LeetCode)

思路:如果一棵树对应的位置是None, 那就返回另一课树,如果不是,则把两棵树的值相加。左子树和右子树分别进行递归。 

class Solution(object):
    def mergeTrees(self, root1, root2):      
        if root1 == None:
            return root2
        if root2 == None:
            return root1
        root = TreeNode(root1.val + root2.val)
        root.left = self.mergeTrees(root1.left, root2.left)
        root.right = self.mergeTrees(root1.right, root2.right)

        return root
        

二叉搜索树的节点搜索与验证

回顾一下二叉搜索树的定义:根节点的值要比左子树中所有节点的值要大,比右子树中所有节点的值要小。同时左子树和右子树都符合这一规定。

700. 二叉搜索树中的搜索

题目链接: 700. 二叉搜索树中的搜索 - 力扣(LeetCode)

有了这个定义,很快便能写出代码:如果节点值比当前root小,就在root的左子树里面继续找,如果比当前root大,就在root的右子树里面找,如果和root值相等,或者root为空,直接返回root.

class Solution(object):
    def searchBST(self, root, val):
        if root == None or val == root.val:
            return root
        if val < root.val:
            return self.searchBST(root.left, val)
        if val > root.val:
            return self.searchBST(root.right, val)
        

不用递归,也可以直接用迭代法:

class Solution(object):
    def searchBST(self, root, val):
        while root:
            if val > root.val:
                root = root.right
            elif val < root.val:
                root = root.left
            else:
                return root
        return None

98. 验证二叉搜索树

这道题不能像之前那样设定好单独的条件(根节点大于左节点,小于右节点)后,将左子树和右子树部分分别放入递归,因为我们要考虑的是左子树和右子树的所有节点和根节点的数值比较,不能单独考虑每个小二叉树。比如:

 

根节点5的右子树符合判断情况,但节点3小于5,整体不符合。

二叉搜索树巧妙的一点是它们的中序数组是有序的!因此,我们只需用递归得到它的中序遍历得到的数组是不是单调递增的就可。

class Solution(object):
    def __init__(self):
        self.list = []

    def traversal(self, root):
        if not root:
            return None
        self.traversal(root.left)
        self.list.append(root.val)
        self.traversal(root.right)
        
    def isValidBST(self, root):
        self.list = []
        self.traversal(root)

        for i in range(len(self.list) - 1):
            if self.list[i] >= self.list[i + 1]:
                return False

        return True
        

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值