代码随想录day21

二叉搜索树的最小绝对差代码随想录day21_第1张图片

思路:记住二叉搜索树的特性,中序遍历是有序数组,所以我们直接对树做一次中序遍历,然后对数组中的node进行一次循环遍历不断获取最小值就行了,这里需要创建一个max_value拿来作比较

 对于中序遍历这里就不多阐述了,奥这里我踩了好几次的坑,就是我们储存遍历的数组应该定义在主函数中,不然每次遍历都是空数组

代码:

        

def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
        res = []
        self.inorder(root,res)
        max_value = float('inf')
        for i in range(len(res)-1):
            max_value = min(abs(res[i]-res[i+1]),max_value)
        return max_value


    def inorder(self,node,res):
        if not node:
            return None
        self.inorder(node.left,res)#左
        res.append(node.val)#中
        self.inorder(node.right,res)#右

501. 二叉搜索树中的众数

代码随想录day21_第2张图片

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

思路:这里再再再次强调!!!!遍历二叉搜索树即为遍历有序数组!!!!!!那么这个问题就转化成了 递增数组中找出 出现频率最多次数的元素!既然与元素出现次数相关 那就再用一个哈希表来记录即可!

代码:

         

def findMode(self, root: Optional[TreeNode]) -> List[int]:
        res = []
        self.inorder(root,res)
        res_map = {}
        for i in range(len(res)):
            if res[i] not in res_map:
                res_map[res[i]] = 1 
            else:
                res_map[res[i]] += 1 

        maxVal = max(res_map.values())
        ans = []
        for item,val in res_map.items():
            if val>=maxVal:
                ans.append(item)
        return ans 

    def inorder(self,node,res):
        if not node:
            return None
        self.inorder(node.left,res)
        res.append(node.val)
        self.inorder(node.right,res)

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

代码随想录day21_第3张图片

 代码随想录day21_第4张图片

思路:

        首先最容易想到的一个情况:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。 即情况一: 代码随想录day21_第5张图片

 题目强调:二叉树节点数值是不重复的,而且一定存在 q 和 p

如果当p或者q本身就是一个根节点呢?那就是情况二:

       代码随想录day21_第6张图片

 因为遇到 q 或者 p 就返回,这样也包含了 q 或者 p 本身就是 公共祖先的情况

代码:

        

def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if not root:
            return None
        if root==p or root==q:
            return root 
        left = self.lowestCommonAncestor(root.left,p,q)
        right = self.lowestCommonAncestor(root.right,p,q)
        if left!=None and right==None:
            return left 
        elif left==None and right!=None:
            return right
        elif left!=None and right!=None:
            return root
        else:
            return None

你可能感兴趣的:(算法)