1. 程式人生 > 其它 >父子節點不能同時選取,求二叉樹中最大子節點和

父子節點不能同時選取,求二叉樹中最大子節點和

題幹:給定一個二叉樹,每個節點具備一個權重值,按照如下規則選取二叉樹中的節點,如果選取了某個節點,那麼其子節點都不能被選取了。在這個規則下面,求解可能的最大子節點和。
思路:核心思路是遞迴,求得包含樹根節點的最大子節點和以及不包含樹根節點的最大子節點和,在根據左右字數的結果處理遞迴結果。

class TreeNode(object):
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

    def print(self):
        node_list = [self]
        i = 0
        while i < len(node_list):
            cur = node_list[i]
            print(cur.val)
            if cur.left:
                node_list.append(cur.left)
            if cur.right:
                node_list.append(cur.right)
            i += 1
        print('-'*20)


def load_tree(a):
    if not a:
        return None
    root = TreeNode(a[0])
    node_list = [root]
    i = 1
    j = 0
    while i+1 < len(a):
        cur = node_list[j]
        cur.left = TreeNode(a[i])
        cur.right = TreeNode(a[i+1])
        node_list.append(cur.left)
        node_list.append(cur.right)
        i += 2
        j += 1
    return root

# 題解
def find_largest_subset(node):
    if not node:
        return 0, 0
    rst_with_left, rst_wo_left = find_largest_subset(node.left)
    rst_with_right, rst_wo_right = find_largest_subset(node.right)
    return node.val + rst_wo_left + rst_wo_right, max(rst_with_left, rst_wo_left) + max(rst_with_right, rst_wo_right)


tree = load_tree([1, 10, 2, 3, 4, 10, 20])
tree.print()

rst = find_largest_subset(tree)
print(rst, max(rst))