二叉树
700. 二叉搜索树中的搜索
传送门
比较简单,递归和迭代都可以。
class Solution:
def searchBST(self, root: TreeNode, val: int) -> TreeNode:
if not root: return None
if root.val == val: return root
if root.val < val: return self.searchBST(root.right, val)
if root.val > val: return self.searchBST(root.left, val)
class Solution:
def searchBST(self, root: TreeNode, val: int) -> TreeNode:
if not root: return
while root:
if root.val == val: return root
if root.val < val: root = root.right
elif root.val > val: root = root.left
return
98. 验证二叉搜索树
传送门
可能会想使用递归,每次判断该节点的左节点是不是比根节点小,右节点是不是比根节点大,但是这种情况忽略了子节点的右节点可能比子节点大,但是不一定比根节点小。
而二叉搜索树的特性是:使用中序遍历得到的是一个递增序列。
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
nums = []
def traversal(root):
if not root: return
traversal(root.left)
nums.append(root.val)
traversal(root.right)
traversal(root)
for i in range(1, len(nums)):
if nums[i] <= nums[i-1]: return False
return True
530. 二叉搜索树的最小绝对差
传送门
只要遇到二叉搜索树,首先要想到中序遍历的结果是一个有序数组,然后对有序数组进行判断,会方便很多。但是这种做法不一定是最优的,不过总比写不出来要强。
class Solution:
def getMinimumDifference(self, root: TreeNode) -> int:
# 找树中任意两个不同节点的最小值
if not root: return
nums = []
def traversal(root):
if not root: return
traversal(root.left)
nums.append(root.val)
traversal(root.right)
traversal(root)
res = float('inf')
for i in range(1, len(nums)):
res = min(res, nums[i]-nums[i-1])
return res
501. 二叉搜索树中的众数
传送门
先来一个笨方法,统计每个数的频率,之后再排序。
class Solution:
def findMode(self, root: TreeNode) -> List[int]:
if not root: return
dic = collections.defaultdict(int)
def traversal(root):
if not root: return
traversal(root.left)
dic[root.val] += 1
traversal(root.right)
traversal(root)
dic = sorted(dic.items(), key=lambda x: x[1], reverse=True)
res = []
pre = 0
for i, (k, v) in enumerate(dic):
if i == 0:
pre = v
res.append(k)
elif pre == v:
res.append(k)
return res