3.4python如何求一棵二叉树的最大子树和

题目描述:

给定一棵二叉树,它的每个结点都是正整数或负整数,如何找到一棵子树,使得它所有结点的和最大?

思路:

要求一棵二叉树的最大子树和,最容易想到的是针对每棵子树,求出这棵子树所有结点的和,然后从中找出最大值。恰好二叉树的后序遍历就能做到这一点。在对二叉树进行后序遍历的过程中,如果当前遍历的结点的值与其左右子树的和的值相加的结果大于最大值,则更新最大值。
如下图所示:
在这里插入图片描述
在上面这个图中,首先遍历结点 -1,这个子树的最大值为 -1,同理,当遍历到结点 9 时,子树的最大值为 9,当遍历到结点 3 的时候,这个结点与其左右孩子结点值的和(3-1+9=11)大于最大值(9),所以,此时最大的子树为以 3 为根节点的子树,依次类推,直到遍历完整棵树为止。

算法性能分析:
此方法与二叉树的后序遍历有相同的时间复杂度,即为O(n),n为二叉树的结点个数。
代码实现:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time    : 2020/1/23 21:27
# @Author  : buu
# @Software: PyCharm
# @Blog    :https://blog.csdn.net/weixin_44321080
class BiTNode:
    def __init__(self):
        self.data = None
        self.lchild = None
        self.rchild = None


class Test:
    def __init__(self):
        self.maxSum = -2 ** 31

    def findMaxSubTree(self, root, maxRoot):
        """
        求最大子树
        :param root: 二叉树的根结点
        :param maxRoot: 最大值子树对应的根结点
        :return:最大值
        """
        if root == None:
            return 0
        lmax = self.findMaxSubTree(root.lchild, maxRoot)  # 求root左子树所有结点的和
        rmax = self.findMaxSubTree(root.rchild, maxRoot)  # 求root右子树所有结点的和
        sums = lmax + rmax + root.data
        if sums > self.maxSum:
            self.maxSum = sums
            maxRoot.data = root.data
        return sums  # 返回以 root 为根结点的子树的所有结点的和

    def constructTree(self):
        """
        构造二叉树
        :return:
        """
        root = BiTNode()
        node1 = BiTNode()
        node2 = BiTNode()
        node3 = BiTNode()
        node4 = BiTNode()
        root.data = 6
        node1.data = 3
        node2.data = -7
        node3.data = -1
        node4.data = 9
        root.lchild = node1
        root.rchild = node2
        node1.lchild = node3
        node1.rchild = node4
        node2.lchild = node2.rchild = node3.rchild = node3.lchild = \
            node4.lchild = node4.rchild = None
        return root


if __name__ == '__main__':
    test = Test()
    root = test.constructTree()  # 构造二叉树
    maxRoot = BiTNode()
    test.findMaxSubTree(root, maxRoot)
    print('max sub tree sum: ' + str(test.maxSum))
    print('root of the sub tree is ' + str(maxRoot.data))

结果:
在这里插入图片描述

end

发布了76 篇原创文章 · 获赞 2 · 访问量 2559

猜你喜欢

转载自blog.csdn.net/weixin_44321080/article/details/104077904