代码随想录算法训练营第二十三天 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

目录

530.二叉搜索树的最小绝对差

思路

代码

501.二叉搜索树中的众数

思路

代码

 236. 二叉树的最近公共祖先  

思路

代码


530.二叉搜索树的最小绝对差

需要领悟一下二叉树遍历上双指针操作,优先掌握递归 
思路

        二叉搜索树的一个很重要的特性——中序遍历是一个有序的递增数组。有序递增数组求两个数的最小差值那不是有手就行。

代码
class Solution:
    def __init__(self):
        self.vec = []

    def traversal(self, root):
        if root is None:
            return
        self.traversal(root.left)
        self.vec.append(root.val)  # 将二叉搜索树转换为有序数组
        self.traversal(root.right)

    def getMinimumDifference(self, root):
        self.vec = []
        self.traversal(root)
        if len(self.vec) < 2:
            return 0
        result = float('inf')
        for i in range(1, len(self.vec)):
            # 统计有序数组的最小差值
            result = min(result, self.vec[i] - self.vec[i - 1])
        return result

501.二叉搜索树中的众数

和 530差不多双指针思路,不过 这里涉及到一个很巧妙的代码技巧。
思路

       这里首次引入了pre指针,采用的还是二叉树的中序遍历,每次和前一个数进行比较,如果一样,count就+1,每层遍历时在遍历中间节点后更新出现次数最大的数,注意每次更新最大的数需要把原来的res[ ] 清空,因为原来里面装的不是出现频率最大的数了。

代码
from collections import defaultdict
from typing import Optional, List


class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution:
    def __init__(self):
        self.res = []
        self.count = 0
        self.maxcount = 0
        self.pre = None

    def findMode(self, root: Optional[TreeNode]) -> List[int]:
        self.count = 0
        self.maxcount = 0
        self.pre = None
        self.res = []
        self.traversal(root)
        return self.res

    def traversal(self, cur):
        if not cur:
            return None
        # 左
        self.traversal(cur.left)

        # 中
        if not self.pre:
            self.count = 1
        elif self.pre.val == cur.val:
            self.count += 1
        else:
            self.count = 1
        self.pre = cur

        if self.count > self.maxcount:  # 当前计数频率大于最大值频率,更新max,清空res
            self.maxcount = self.count
            self.res = []

        if self.count == self.maxcount:
            self.res.append(cur.val)

        # 右
        self.traversal(cur.right)
        return

 236. 二叉树的最近公共祖先  

本题其实是比较难的,可以先看我的视频讲解 
思路

        这种题就是我看着好像知道什么个原理,实际上让我写写不了一点。。。(每日崩溃1/1)

 这道题使用的是后序遍历,如果遍历到当前节点就是p或者q就返回当前节点,层层往回传,最后会传到根节点。(因为是后序遍历,哪怕找到了答案也要遍完的)(我知道我这么讲大家根本听不懂,所以点开视频看吧,Carl哥讲的超级nice,再配合代码应该可以看懂)

代码
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None


class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if root == p or root == q or root is None:
            return root

        left = self.lowestCommonAncestor(root.left,p,q)
        right = self.lowestCommonAncestor(root.right,p,q)

        if left is not None and right is not None:
            return root

        elif left is None and right is not None :
            return right

        elif left is not None and right is None:
            return left

        else:
            return None
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值