第二十一天|二叉树

文章介绍了如何在二叉搜索树(BST)中通过不同方法解决三个问题:找到BST中的最小绝对差值,查找BST中出现次数最多的元素(模式),以及确定二叉树的最低公共祖先。方法包括借助数组、哈希表和深度优先搜索等策略。
摘要由CSDN通过智能技术生成

今天的题主要要理解逻辑

530. Minimum Absolute Difference in BST

这道题如果借助额外的array的话,会简单很多.对于bst来说, inorder 的遍历的值一定是单调递增的

Way1:

inorder遍历bst,然后将数值存在array里面,之后遍历array算差值找到最小的插值

class Solution:
    def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
        res=[]
        def inorder(node):
            if not node:
                return
            inorder(node.left)
            res.append(node.val)
            inorder(node.right)
        inorder(root)
        val=float("inf")
        for i in range(len(res)-1):
            val=min(val,res[i+1]-res[i])
        return val

501. Find Mode in Binary Search Tree

这道题还是要用遍历. 但是额外借助的数据结构上可以做很多的优化

Way1:

用hashmap再遍历的过程中来记录次数.然后找到最大的次数并输出相对的值

class Solution:
    def findMode(self, root: Optional[TreeNode]) -> List[int]:
        dic={}
        def dfs(node):
            if not node:
                 return
            dfs(node.left)
            if node.val not in dic:
                dic[node.val]=1
            else:
                dic[node.val]+=1
            dfs(node.right)
        dfs(root)
        maxval=max(dic.values())
        res=[]
        for k,v in dic.items():
            if v==maxval:
                res.append(k)
        return res

Way2:

这种方法要用多个variable和一个array来取代hashmap. 同时这些要是全局的.还是用inorder遍历,涉及到值的操作的时候要判断最大的mode的值还有对当前的值的计数

class Solution:
    def findMode(self, root: Optional[TreeNode]) -> List[int]:
        self.count=0
        self.max_count=0
        self.res=[]
        self.pre=TreeNode()
        def dfs(node):
            if not node:
                return
            dfs(node.left)
            if not self.pre:
                self.count=1
            elif node.val==self.pre.val:
                self.count+=1
            else:
                self.count=1
            self.pre=node
            if self.count==self.max_count:
                self.res.append(node.val)
            if self.count >self.max_count:
                self.max_count=self.count
                self.res=[node.val]
            dfs(node.right)
        dfs(root)
        return self.res

236. Lowest Common Ancestor of a Binary Tree

这道题的一个关键点在于怎么用返回值.如果需要返回值,则需要left和right分别调用,如果不需要返回值则直接用if node.left 和if node.right

Way1:

遍历的过程中判断左右子树是否看到了q或者p的值,根据不同的情况来决定输出哪个node

如果都找到了,则证明当前的node为答案

如果只找到一个则往上返回找到的哪个node

如果为空node,则返回当前的node

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
        if not left and right:
            return right

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值