验证二叉搜索树


LeetCode : 98. 验证二叉搜索树

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:


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

输入:
    2
   / \
  1   3
输出: true
示例 2:

输入:
    5
   / \
  1   4
     / \
    3   6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
     根节点的值为 5 ,但是其右子节点值为 4 。
 

思路:中序遍历,结果从小到大,而且没有重复元素即为二叉树

定义+创建二叉树:

# Definition for a binary tree node.
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
def Create_tree(root,list,i):
    if i<len(list):
        if not list[i]: return None # 返回值 == None,以下不必判断
        else:
            root = TreeNode(list[i])

            root.left = Create_tree(root.left,list,i*2+1)
            root.right= Create_tree(root.right,list,i*2+2)
            return root
    return root

中序遍历:递归+迭代

class Solution:
    # 中序 递归遍历
    def isValidBST(self, root: TreeNode) -> bool:
        res = []
        def helper(root):
            if not root:    return None
            helper(root.left)
            res.append(root.val)
            helper(root.right)
        helper(root)
        return res==sorted(res) and len(set(res))==len(res)

    # 中序 迭代遍历
    def isValidBST2(self, root: TreeNode) -> bool:
        res =[]
        if not root:    return res
        stack =[]
        p = root
        while p or stack:
            while p:
                stack.append(p)
                p=p.left
            p=stack.pop()
            res.append(p.val)
            p = p.right
        # return res
        return res==sorted(res) and len(set(res))==len(res)

python 知识点: len(set(res))==len(res) 

set 将列表转换成元组同时去除其中的重复元素

 

测试代码:


if __name__ == "__main__":
    s = Solution()
    nums= [5,1,4,None,None,3,6]
    root = Create_tree(None,nums,0)
    r = s.isValidBST(root)
    print(r)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值