二叉树-7.4(补) 搜索树判断

视频教程中只提到了该类型的题目,却没有给出相关例题,此处用leetcode题目代替

98. 验证二叉搜索树 - 力扣(LeetCode)

题目:

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

 

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/validate-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

由题可知:一个搜索树,其中序遍历必然是有序的。因此可以用last记录前一个结点的值,初始化为-inf。只需要判断中序遍历中是否每一个数都比前一个数大即可。中序遍历相关代码可见:二叉树-7.1 二叉树序列打印_Iamlzm的博客-CSDN博客

由于要得到搜索树上最左边的值,递归的方法不太好做,这里可以用迭代或者morris方法完成

代码:

迭代方法:

class Solution(object):
    def isValidBST(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        last = -float('inf')
        cur = root
        st = []
        while cur or st:
            while cur:
                st.append(cur)
                cur = cur.left
            top = st.pop()
            if top.val > last:
                last = top.val
            else:
                return False
            if top.right:
                cur = top.right
        return True

morris方法:

class Solution(object):
    def isValidBST(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        last = -float('inf')
        p1, p2 = root, None
        while p1:
            p2 = p1.left
            if p2:
                while p2.right and p2.right != p1:
                    p2 = p2.right
                if not p2.right:
                    p2.right = p1
                    p1 = p1.left
                    continue
                else:
                    p2.right = None
            if last >= p1.val:
                return False
            last = p1.val
            p1 = p1.right

        return True

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值