导读
通过中序遍历二叉搜索树得到的关键码序列是一个递增序列。
基于以下广度优先遍历模板:
- 准备工作:a. 建(栈/队列/指针);b. 压/指;
- 正片,双重while循环,当指针不为空 & 栈也不为空时:a. 把所有左子树加到栈里,b.逐个弹出;c.处理;d.有右子树的下探其右子树;
基于以下广度优先遍历代码:
stack = [] # 建:栈stack & 指针p
p = root # 压 / 指
# 双重while循环
while p is not None or stack:
while p is not None: # 若有左子树
stack.append(p) # 把所有左子树加到栈里
p = p.left
p = stack.pop()
proc(p.val)
p = p.right # 若当前弹出的根节点有右子树
1.二叉搜索树的最小绝对差(Leetcode530)
idea: 中序遍历二叉树(inorder traverse)
利用中序遍历二叉树得到的是上升序列,故可以求两个节点之间的差值,得到最小绝对差;
直接在广度优先遍历二叉树的模板上改,括号里面是新增的:
- 准备工作: 建栈和指针; 把指针指向根节点(其实是赋值); (建立两个整形变量,前一个节点值pre和最小值minVal)
- 双重while循环: 内层为一直往左子树探; 弹出节点; (取值,更新最小值,更新前一个节点值), 往右子树下探
代码:
Python版
class Solution:
def getMinimumDifference(self, root: TreeNode) -> int:
stack = []
p = root
pre = -float('inf') # 本题新增的
min_val = float('inf') # 本题新增的
while p is not None or stack:
while p is not None:
stack.append(p)
p = p.left
p = stack.pop()
cur = p.val
if cur - pre < min_val: # 本题新增的
min_val = cur - pre
pre = cur
p = p.right
return min_val
2.二叉搜索树的最小绝对差(Leetcode530)
idea: 中序遍历二叉树(inorder traverse)
利用中序遍历二叉树得到的是上升序列,故可以求两个节点之间的差值,得到最小绝对差;
直接在广度优先遍历二叉树的模板上改,括号里面是新增的:
- 准备工作: 建栈和指针; 把指针指向根节点(其实是赋值); (建立一个整形变量计数器cnt,统计当前数字是第几小的了)
- 双重while循环: 内层为一直往左子树探; 弹出节点; (计数器+1,并判断是否已经是第k小的了), 往右子树下探
代码:
Python版
class Solution:
def kthSmallest(self, root: TreeNode, k: int) -> int:
stack = []
p = root
cnt = 0
while p is not None or stack:
while p is not None:
stack.append(p)
p = p.left
p = stack.pop()
cnt += 1 # 本题新增的
if cnt == k: # 本题新增的
return p.val
p = p.right