98. 验证二叉搜索树

    上来我就是只考虑了相邻节点之间的关系:

其实从左<根<右的提示就应该想到中序遍历,假如是搜索二叉树的话,中序遍历得到的结果就应该是绝对升序的列表。在遍历的过程中有降序的节点就判断不是搜索二叉树。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def isValidBST(self, root: TreeNode) -> bool:
        if not root:
            return True
        stack = []
        pre = float("-inf")
        while stack or root:
            while root:
                stack.append(root)
                root = root.left
            root = stack.pop()
            # 中序遍历的时候 栈里元素弹出的时操作
            # 判断是否逆序
            if root.val<=pre:
                return False
            else:
                pre = root.val
            root = root.right
        return True
        

也可以用中序遍历的递归方式来解决

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def __init__(self):
        # 用这个属性保存当前节点的数值
        self.pre = None

    def isValidBST(self, root: TreeNode) -> bool:
        if not root:
            return True
        if root:
            left = self.isValidBST(root.left)
            # 这个地方的root是和递归遍历一直变化的
            if self.pre==None:
                self.pre =root.val
            elif self.pre<root.val:
                self.pre =root.val
            else:
                return False
            right = self.isValidBST(root.right)
            return left and right 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值