📅  最后修改于: 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)。