【问题标题】:Count number of nodes per level in a binary tree计算二叉树中每层的节点数
【发布时间】:2018-04-18 21:14:22
【问题描述】:
我现在一直在寻找一些东西,但找不到与我的问题类似的东西。也许我只是没有正确搜索。无论如何,这是我考试复习中的一个问题。给定一棵二叉树,我需要输出一个列表,使得列表中的每个项目都是项目列表索引处二叉树中一个级别上的节点数。我的意思是,lst = [1,2,1] 并且第 0 个索引是树中的第 0 级,而 1 是该级别中有多少个节点。 lst[1] 将表示该二叉树中第 1 层的节点数 (2)。不保证该树是平衡的。我们只学过前序遍历、中序遍历和后序遍历,我看不出它们在这个问题上有什么用处。我不是在要求特定的代码,只是想知道如何解决这个问题或其背后的逻辑。任何帮助表示赞赏。
【问题讨论】:
标签:
python
python-3.x
tree
binary-tree
tree-traversal
【解决方案1】:
只要您只计算每个节点一次,搜索顺序并不重要。具有递归的深度优先搜索解决方案是:
- 创建地图
counters 来存储每个级别的计数器。例如。 counters[i] 是目前在级别 i 上找到的节点数。假设 0 级是根。
- 定义递归函数
count_subtree(node, level):将counters[level] 递增一次。然后对于给定节点的每个子节点,调用count_subtree(child, level + 1)(子节点处于更深的 1 级)。
- 调用
count_subtree(root_node, 0) 从根开始计数。这将导致count_subtree 在每个节点上仅运行一次,因为每个节点只有一个父节点,因此counters[level] 将在每个节点上递增一次。叶节点是基本情况(没有子节点可以调用递归函数)。
- 根据计数器的值构建最终列表,按其键升序排列。
这适用于任何类型的树,而不仅仅是二叉树。运行时间为 O(树中的节点数)。旁注:深度优先搜索解决方案比类似的广度优先搜索解决方案更容易划分和运行在并行处理器或机器上。