📌  相关文章
📜  给定树中给定节点之间的所有主要权重节点的计数(1)

📅  最后修改于: 2023-12-03 15:27:35.699000             🧑  作者: Mango

给定树中给定节点之间的所有主要权重节点的计数介绍

本文介绍一个问题:给定一棵树和两个节点,找到这两个节点之间所有主要权重节点的个数。

主要权重节点是指在从根节点到该节点的路径上,该节点所在子树的大小不超过所有子树大小的一半的节点。

如下图所示:

tree

在 Example 树中找到节点 3 和 7 之间的主要权重节点。路径为 3->1->5->7。这条路径上的节点为 1,5,7。

以下是求解该问题的 Python 代码。代码使用了深度优先搜索和前序遍历来计算子树大小,并逐层递归搜索节点。该算法的时间复杂度为 O(n log n),其中 n 为树的节点数。

'''
Definition for a binary tree node.
class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
'''

class Solution(object):
    def dfs(self, node):
        if not node:
            return 0
        left = self.dfs(node.left)
        right = self.dfs(node.right)
        node.subtree_size = left + right + 1
        return node.subtree_size
    
    def count(self, node, n):
        if not node:
            return 0
        ans = 0
        if node.subtree_size <= n / 2:
            ans += 1
        ans += self.count(node.left, n) + self.count(node.right, n)
        return ans
    
    def lca(self, root, p, q):
        self.dfs(root)
        if p.subtree_size > q.subtree_size:
            p, q = q, p
        n = p.subtree_size + q.subtree_size
        node = root
        while node:
            left_size = node.left.subtree_size if node.left else 0
            right_size = node.right.subtree_size if node.right else 0
            if left_size < n / 2 and right_size < n / 2:
                break
            if left_size >= n / 2:
                node = node.left
            else:
                node = node.right
        return self.count(node, n)

以上就是给定树中给定节点之间的所有主要权重节点的计数的介绍。