Leetcode团灭系列之中序遍历二叉搜索树问题

导读

通过中序遍历二叉搜索树得到的关键码序列是一个递增序列。
基于以下广度优先遍历模板:

  1. 准备工作:a. 建(栈/队列/指针);b. 压/指;
  2. 正片,双重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)
利用中序遍历二叉树得到的是上升序列,故可以求两个节点之间的差值,得到最小绝对差;
直接在广度优先遍历二叉树的模板上改,括号里面是新增的:

  1. 准备工作: 建栈和指针; 把指针指向根节点(其实是赋值); (建立两个整形变量,前一个节点值pre和最小值minVal)
  2. 双重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)
利用中序遍历二叉树得到的是上升序列,故可以求两个节点之间的差值,得到最小绝对差;
直接在广度优先遍历二叉树的模板上改,括号里面是新增的:

  1. 准备工作: 建栈和指针; 把指针指向根节点(其实是赋值); (建立一个整形变量计数器cnt,统计当前数字是第几小的了)
  2. 双重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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值