LeetCode 98. 验证二叉搜索树

98. 验证二叉搜索树

Difficulty: 中等

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

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

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

示例 1:

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

示例 2:

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

Solution

Language: 全部题目
错误解法一:

# 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.left or not root.right:
            return False
        elif root.left.val < root.val and root.val > root.right.val:
            return True
        else:
            return False
        return isValidBST(root.left) and isValidBST(root.right)
            

错误解法二:没有考虑数组中有连续重复元素或者元素值全部相同的情形

# 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:
        out = inOrderTraversal(root)
        return sorted(out) == out

def inOrderTraversal(tree):
    if not tree:
        return []
    else:
        l = inOrderTraversal(tree.left)
        d = [tree.val]
        r = inOrderTraversal(tree.right)
        return l + d + r

解决办法:排除数组中存在重复元素的情形

class Solution:
    def isValidBST(self, root: TreeNode) -> bool:
        out = inOrderTraversal(root)
        return sorted(out) == out and len(set(out)) == len(out)

def inOrderTraversal(tree):
    if not tree:
        return []
    else:
        l = inOrderTraversal(tree.left)
        d = [tree.val]
        r = inOrderTraversal(tree.right)
        return l + d + r
posted @ 2020-11-16 21:04  swordspoet  阅读(88)  评论(1)    收藏  举报