首页 > 编程语言 >算法- 求解最大平均值的子树-经典dfs题目

算法- 求解最大平均值的子树-经典dfs题目

时间:2023-05-31 10:33:17浏览次数:27  
标签:node 子树 self dfs 算法 right root sum size

给一棵二叉树,找到有最大平均值的子树。返回子树的根结点。

Example

样例1

输入:
{1,-5,11,1,2,4,-2}
输出:11
说明:
这棵树如下所示:
     1
   /   \
 -5     11
 / \   /  \
1   2 4    -2 
11子树的平均值是4.333,为最大的。

样例2

输入:
{1,-5,11}
输出:11
说明:
     1
   /   \
 -5     11
1,-5,11 三棵子树的平均值分别是 2.333,-5,11。因此11才是最大的.
参考代码:
"""
Definition of TreeNode:
class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left, self.right = None, None
"""

class Solution:
    """
    @param root: the root of binary tree
    @return: the root of the maximum average of subtree
    """
    def findSubtree2(self, root):
        # write your code here
        self._result_node = None
        self._result_val = -float("inf")
        self.find_sub_tree(root)
        return self._result_node
    
    
    def find_sub_tree(self, root):
        if not root:
            return 0, 0
        
        left_sum, left_size = self.find_sub_tree(root.left)
        right_sum, right_size = self.find_sub_tree(root.right)
        
        sum = root.val + left_sum + right_sum
        size = left_size + right_size + 1
        avg_val = float(sum)/size
        
        if self._result_node is None or self._result_val < avg_val:
            self._result_node = root
            self._result_val = avg_val
            
        return sum, size

 

关于何时使用成员变量的问题,如果_result_node 不是成员变量,则需要以参数形式返回,在所有节点遍历时候用到,导致代码重复,因此直接使用成员变量(有点全局的味道)更好。

 

官方代码:【写得比我好,尤其是成员变量使用static】

class Solution:
    # @param {TreeNode} root the root of binary tree
    # @return {TreeNode} the root of the maximum average of subtree
    average, node = 0, None

    def findSubtree2(self, root):
        # Write your code here
        self.helper(root)
        return self.node

    def helper(self, root):
        if root is None:
            return 0, 0

        left_sum, left_size = self.helper(root.left)
        right_sum, right_size = self.helper(root.right)

        sum, size = left_sum + right_sum + root.val, \
                    left_size + right_size + 1

        if self.node is None or sum * 1.0 / size > self.average:
            self.node = root
            self.average = sum * 1.0 / size

        return sum, size

  

需要在遍历中记住上次遍历节点,根据上次的节点和当前节点进行比较而得到result的算法模板:

class Solution():
last_node = None
result = None
 
def run(self, root):
self.dfs(root)
return self.result
 
def dfs(self):
if last_node is None:
last_node = root
else:
do_sth(last_node, root)
 
dfs(root.left)
 
dfs(root.right)

  

标签:node,子树,self,dfs,算法,right,root,sum,size
From: https://blog.51cto.com/u_11908275/6384766

相关文章

  • 字符串解压缩问题——贪心算法
     importsysdefload_data():returnsys.stdin.read()defget_position_map(s):result={}stack=[]fori,cinenumerate(s):ifc=="[":result[i]=-1stack.append(i)elifc=="......
  • dfs 二叉树中序遍历迭代解法——求解BST中第k小元素
    BST中第K小的元素中文English给一棵二叉搜索树,写一个 KthSmallest 函数来找到其中第K小的元素。Example样例1:输入:{1,#,2},2输出:2解释: 1 \ 2第二小的元素是2。样例2:输入:{2,1,3},1输出:1解释:2/\13第一小的元素是1。Challenge如果这棵BST经常会被修改(......
  • python dijkstra 最短路算法示意代码
     defdijkstra(graph,from_node,to_node):q,seen=[(0,from_node,[])],set()whileq:cost,node,path=heappop(q)seen.add(node)path=path+[node]ifnode==to_node:returncost,pathfora......
  • 第三代测序中基于德布鲁因图的长读错误纠正算法
    第三代测序中基于德布鲁因图的长读错误纠正算法摘要——PacBio单分子实时测序平台可以产生大量的长读序列,这对基因组的从头组装非常重要。尽管这些长读取具有15%的高错误率,但是由于它们的高错误率而放弃它们是不明智的。Illumina测序平台产生了长度在100bp左右的短读,错误率低,成本......
  • 面向第三代测序技术的基因组长序列片段比对算法研究
    面向第三代测序技术的基因组长序列片段比对算法研究周佩霞湖南师范大学摘要:随着测序技术不断发展和改进,测得的基因组序列片段数据的特征也在不断变化。为适应当前第三代测序技术,基因组序列比对算法需要进行深入的研究和改进,以便更适合于处理第三代测序技术测得的长序列片......
  • 基于第三代测序技术的基因组SNP和Indel变异检测关键算法研究
    基于第三代测序技术的基因组SNP和Indel变异检测关键算法研究廖小青哈尔滨工业大学摘要:随着生活水平的提升,人们对于自身的好奇促使人们对基因进行研究。其中,变异是人类疾病的一个重要诱因,对变异进行研究可以推动基础生物学和医学的发展。相比于大区域基因组的结构变异,SNP......
  • 【视频】支持向量机算法原理和Python用户流失数据挖掘SVM实例
    全文链接:http://tecdat.cn/?p=32604原文出处:拓端数据部落公众号分析师:BaileyZheng和Lijie Zhang即使是同一种植物,由于生长的地理环境的不同,它们的特征会有所差异。例如鸢尾花,可分为山鸢尾、杂色鸢尾、维吉尼亚鸢尾。假设此时您得到了一朵鸢尾花,如何判断它属于哪一类呢?支......
  • SSTF算法
    oj:https://codefun2000.com/p/P1269学一个新东西multiset里面是排好序的可以存重复的值但是里面的值不能被修改否则就不能排序了可以用lower_bound(x),得到multiset中大于等于x的最小的数的位置autori=q.lower_bound(x)若x比multiset中的任何数字都要大,则会返回q.end......
  • 基于FPGA的LFSR16位伪随机数产生算法实现,可以配置不同的随机数种子和改生成多项式,包
    1.算法仿真效果vivado2019.2仿真结果如下:2.算法涉及理论知识概要LFSR(线性反馈移位寄存器)提供了一种在微控制器上快速生成非序列数字列表的简单方法。生成伪随机数只需要右移操作和XOR操作。LFSR完全由其多项式指定。例如,6千-次多项式与每个项存在用方程x表示6+x5+x4+x3......
  • 算法学习day34贪心part03-1005、134、135
    packageLeetCode.greedypart03;/***1005.K次取反后最大化的数组和*给你一个整数数组nums和一个整数k,按以下方法修改该数组:*选择某个下标i并将nums[i]替换为-nums[i]。*重复这个过程恰好k次。可以多次选择同一个下标i。*以这种方式修改数组后,返回......