破百纪念,怎肯鸽?
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)