Leetcode题解 0027期

破百纪念,怎肯鸽?

0098题 验证二叉搜索树【Validate Binary Search Tree】

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

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

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

示例:

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

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

题目相对严谨

经典题目无需注意太多

解题思路:
标准dfs,直接开始表演

class Solution:
    def check(self, root, small, large):
        if root == None: return True
        if small >= root.val or large <= root.val: return False
        return self.check(root.left, small, root.val) and self.check(root.right, root.val, large)

    def isValidBST(self, root):
        return self.check(root,-0x7fffffff-1,0x7fffffff+1)

0099题 恢复二叉搜索树【Recover Binary Search Tree】

题目:
二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。

进阶要求:

  • 使用 O(n) 空间复杂度的解法很容易实现。
  • 你能想出一个只使用常数空间的解决方案吗?

示例:

输入: [1,3,null,null,2]

   1
  /
 3
  \
   2

输出: [3,1,null,null,2]

   3
  /
 1
  \
   2

输入: [3,1,4,null,null,2]

  3
 / \
1   4
   /
  2

输出: [2,1,4,null,null,3]

  2
 / \
1   4
   /
  3

题目相对严谨

经典题目无需注意太多

解题思路:

class Solution:
    def __init__(self):
        self.error1 = None
        self.error2 = None
        self.tmp = None
    def dfs(self, root):
        if root == None: return
        if root.left != None: dfs(root.left)

        if self.tmp != None and self.tmp.val > root.val:
            if self.error1 == None:
                self.error1 = self.tmp
                self.error2 = root
            else:
                self.error2 = root

        self.tmp = root

        if root.right != None: dfs(root.right)

    def recoverTree(self, root):
        self.dfs(root)
        if self.error1 != None and self.error2 != None:
            self.error1.val, self.error2.val = self.error2.val, self.error1.val

0100题 相同的树【Same Tree】

题目:
给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例:

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

        [1,2,3],   [1,2,3]

输出: true

输入:      1          1
          /           \
         2             2

        [1,2],     [1,null,2]

输出: false

输入:       1         1
          / \       / \
         2   1     1   2

        [1,2,1],   [1,1,2]

输出: false

题目相对严谨

经典题目无需注意太多

解题思路:
终于进位啦
其实本身树的题大多都很经典,尤其是今天前面做过的两道题目,这道题其实更简单

class Solution:
    def isSameTree(self, p, q):
        if p == None or q == None: return p==q
        if p.val != q.val: return False
        return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)

猜你喜欢

转载自blog.csdn.net/bright_silmarillion/article/details/80851123