LeetCode 刷题之旅(2020.05.05)

LeetCode 刷题之旅(2020.05.05)——98. 验证二叉搜索树(中)

题目:

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

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

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

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

示例 2:

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

解题模板:
Python 3:

# 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:

解题思路:

  • 中序遍历二叉树
  • 利用栈操作回溯

利用中序遍历二叉树,确认左子树元素值均小于根节点元素值。

解法:

  1. 中序遍历二叉树
class Solution:
    def isValidBST(self, root: TreeNode) -> bool:
        if not root:
            return True

        def LDR(root):
            if root.left:
                LDR(root.left)
            nums.append(root.val)
            if root.right:
                LDR(root.right)

        nums = []
        LDR(root)
        for i in range(len(nums)):
            if i+1 in range(len(nums)):
                if nums[i] >= nums[i+1]:
                    return False
        return True

时间复杂度O(N)
空间复杂度O(N)

  1. 栈操作回溯
class Solution:
    def isValidBST(self, root: TreeNode) -> bool:
        if not root:
            return True
        stack = []
        nums = []
        while stack or root:
            while root:
                stack.append(root)
                root = root.left
            root = stack.pop()
            if nums and root.val > nums[-1]:
                nums.append(root.val)
            elif nums:
                return False
            else:
                nums.append(root.val)
            root = root.right
        return True

时间复杂度O(N)
空间复杂度O(N)

你可能感兴趣的:(LeetCode每日一题)