代码随想录算法训练营第21天 |

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

530.二叉搜索树的最小绝对差:https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/
代码随想录讲解:https://programmercarl.com/0530.二叉搜索树的最小绝对差.html#算法公开课
501.二叉搜索树中的众数:https://leetcode.cn/problems/find-mode-in-binary-search-tree/description/
代码随想录讲解:
https://programmercarl.com/0501.二叉搜索树中的众数.html#思路
236. 二叉树的最近公共祖先
https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/
代码随想录讲解:https://programmercarl.com/0236.二叉树的最近公共祖先.html#算法公开课

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

题解思路

  • 思路一:转为有序数组,寻找列表中最小数
  • 思路二:按照中序遍历 设置前后指针

题解代码

class Solution:
    def __init__(self):
        self.res = float('inf')
        self.vec = []
    def trans(self,root):
        if not root:
            return
        self.trans(root.left)
        self.vec.append(root.val)
        self.trans(root.right)

    def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
        self.trans(root)
        for i in range(len(self.vec)-1):
            self.res = min(self.vec[i+1]-self.vec[i],self.res)
        return self.res
class Solution:
    def __init__(self):
        self.res = float('inf')
        self.pre = None

    def trans(self,root):
        if not root:
            return
        self.trans(root.left)
        if self.pre:
            self.res = min(self.res,abs(root.val-self.pre.val))
        self.pre = root
        self.trans(root.right)

    def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
        self.trans(root)
        return self.res

501.二叉搜索树中的众数

题解思路

  • 思路一:统计map 直接找map中最大的
  • 思路二:直接记录当前最大值(利用二叉搜索树的性质)

题解代码

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

    def trans(self,root):
        if not root:
            return
        self.findMode(root.left)
        if root.val == self.pre:
            self.currcount = self.currcount+1
        else:
            self.currcount = 1

        if self.maxcount<self.currcount:
            self.res = [root.val]
            self.maxcount = self.currcount
        elif self.maxcount==self.currcount:
            self.res.append(root.val)
        self.pre = root.val

        self.findMode(root.right)

    def findMode(self, root: Optional[TreeNode]) -> List[int]:
        self.trans(root)
        return self.res

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

题解思路:

  • 后序遍历
  • 递归法
  • 判断思路:分别在左子树和右子树中找p,q 如果左右两个树都找到了 如果没找到说明继续循环;

题解代码:

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if root==q or root==p or not root:
            return root
        left = self.lowestCommonAncestor(root.left,p,q)
        right = self.lowestCommonAncestor(root.right,p,q)
        if left and right:
            return root
        if left and not right:
            return left
        elif right and not left:
            return right
        else:
            return None
posted @ 2024-07-15 15:09  哆啦**  阅读(7)  评论(0)    收藏  举报