📜  最大化二叉树中根到叶路径中设置位的计数(1)

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

最大化二叉树中根到叶路径中设置位的计数

给定一颗二叉树,每个节点包含一个0或1的值。需要找到从根到叶的所有路径中,二进制表示下为一个数的最大值,并返回这个最大值的二进制表示下1的个数。

思路

使用深度优先搜索(DFS)遍历二叉树,对于每个节点记录其二进制表示下的值以及它的深度。当到达叶节点时,计算该叶节点的二进制值的1的个数,并更新全局最大值。

需要注意的是,在计算一个节点的二进制值时,需要将其父节点的二进制值左移1位后加上当前节点的0或1的值。

代码实现
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution:
    def __init__(self):
        self.max_bit_count = 0
    
    def dfs(self, node: TreeNode, val: int, depth: int) -> None:
        if not node:
            return
        val = (val << 1) | node.val
        if not node.left and not node.right:
            self.max_bit_count = max(self.max_bit_count, self.count_bits(val))
        else:
            self.dfs(node.left, val, depth+1)
            self.dfs(node.right, val, depth+1)
    
    def count_bits(self, n: int) -> int:
        count = 0
        while n:
            count += n & 1
            n >>= 1
        return count
    
    def max_path_bits(self, root: TreeNode) -> int:
        self.dfs(root, 0, 0)
        return self.max_bit_count
时间复杂度

遍历整颗树,时间复杂度为O(n),其中n为树的节点数。

空间复杂度

需要使用递归栈,空间复杂度为O(h),其中h为树的高度。在最坏情况下(树为一条链),空间复杂度为O(n)。