0
点赞
收藏
分享

微信扫一扫

《鸟哥的Linux私房菜》第6章——总结与习题参考答案

7dcac6528821 2024-03-15 阅读 5

最小绝对差

1.申请一个数组,比较两两之间最小的差值

 def getresult3(self,node:TreeNode):
        self.nums=[]
        self.getMinimumDifference(node)
        mindifference=float('inf')
        for i in range(len(self.nums)-1):
            mind=self.nums[i+1]-self.nums[i]
            if mindifference>mind:
                mindifference=mind

        return mindifference
    def getMinimumDifference(self,node:TreeNode):
        if node is None:
            return
        self.getMinimumDifference(node.left)
        self.nums.append(node.val)
        self.getMinimumDifference(node.right)

2.不申请数组,利用双指针解法

 def getMinimumDifference2(self,node:TreeNode):
        self.pre=None   # 双指针解法,当前node与pre的差值
        self.result=float('inf')

        def dfs(node:TreeNode):
            if node is None:
                return
            # 中序遍历:左
            dfs(node.left)
            # 中的逻辑,让result保存最小的差值
            if self.pre is not None:
                self.result=min(self.result,abs(node.val-self.pre.val))
            # 此时pre等于当前current节点,而current节点已经回溯到上一层
            self.pre=node
            # 右
            dfs(node.right)

二叉搜索树中的众数

1.不申请额外空间,动态更新result

  def getMaxFrequency(self,node:TreeNode):
        self.result=[]  # z存放众数的结果集
        self.times=1
        self.maxtimes=0
        self.pre=None
        def dfs(node:TreeNode):
            if node is None:return
            # 左,先一直遍历到最左侧
            dfs(node.left)

            # 中,中间的处理逻辑,判断一个数是不是众数
            if self.pre :
                # 如果两个数相等,那出现的次数就递增
                if node.val==self.pre.val:
                    self.times+=1
                else:
                    self.times=1
                #  如果两个数不相等,并且遍历到一个数的数量超过了另一个数的数量
                    if self.maxtimes< self.times:
                        self.maxtimes=self.times
                        self.result.clear()
                        self.result.append(self.pre.val)

                # 如果两个数的数量相等,那就把两个数都保存在result里,不需要清空
                    elif self.maxtimes==self.times:
                        self.result.append(node.val)
 
            self.pre=node
			# 右
            dfs(node.right)
            
            return self.result

最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]

在这里插入图片描述

示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点 5 和节点 1 的最近公共祖先是节点 3。

示例 2: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出: 5 解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。

class Solution:
    def lowestCommonAncestor(self, root, p, q):
    # 终止条件是如果根节点就包含
        if root == q or root == p 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

        if left is None and right is not None:
            return right
        elif left is not None and right is None:
            return left
        else: 
            return None
举报

相关推荐

0 条评论