BST相关题目并不多,毕竟是一个查找的数据结构。对于BST的题目,最常用的就是中序遍历获得递增序列,进而解决一些题目。在做这一部分题目之前,先默念中序遍历大法。
以 98. Validate Binary Search Tree 为例,如何判断是否为二叉搜索树呢,就是对树进行中序遍历,判断序列是否递增。
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
if not root:
return True
stack = []
p = root
pre = float("-inf")
while p or stack:
while p:
stack.append(p)
p = p.left
p = stack.pop(-1)
if pre >= p.val:
break
pre = p.val
p = p.right
return not p
下面两道题,解题思路如出一辙。
530. Minimum Absolute Difference in BST
Given a binary search tree with non-negative values, find the minimum absolute difference between values of any two nodes.
题目解析:
树中结点都是非负数,求两个结点之差绝对值最小的。其实就是中序遍历序列后一个减前一个的值,最小的。
class Solution:
def getMinimumDifference(self, root: TreeNode) -> int:
min_abs = float("inf")
pre = None
stack = []
while root or stack:
while root:
stack.append(root)
root = root.left
root = stack.pop()
if pre is None:
pre = root.val
else:
dif = root.val - pre
min_abs = min(min_abs, dif)
pre = root.val
root = root.right
return min_abs
538. Convert BST to Greater Tree
Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original BST is changed to the original key plus sum of all keys greater than the original key in BST.
题目解析:
题目意思有些 难理解,看了中文后才明白。每个结点加上比该结点大的所有结点的总和,变成一个累加树。
比该结点大的结点,就是中序遍历序列其后的结点。其解法需了解树的深度优先遍历,谈到三种遍历,都是先左后右,其实先右后左还有相应的三种遍历方法。用哪种遍历,关键是看你要做什么。该题解法,用右-根-左之法求解最为方便。
class Solution:
def convertBST(self, root: TreeNode) -> TreeNode:
cur_sum = 0
stack = []
p = root
while root or stack:
while root:
stack.append(root)
root = root.right
root = stack.pop()
temp = root.val
root.val += cur_sum
cur_sum += temp
root = root.left
return p
这一部分是相对简单的题目,解题思路都是在中序遍历的框架内,加上一些逻辑处理。