计算树中的叶节点

时间:2016-03-23 22:57:26

标签: algorithm tree

假设我们有一棵树,其中每个节点都有预先确定的传出节点集。是否有可能提出快速方式/优化来计算给定级别值的叶节点数?如果有人可以建议任何想法/链接/资源来做同样的事情,那就太好了。

2 个答案:

答案 0 :(得分:0)

没有。你仍然需要遍历整棵树。没有办法只从树的每个节点的子节点数预测精确结构 - 或近似它 -

除此之外:只需保留一个计数器并在每次插入时更新它。更简单,并且不会改变任何操作的时间复杂度,除了计算叶子,这将减少到O(1)

答案 1 :(得分:0)

这实际上可能变得非常艰难。由于编程语言的不同,输入数据结构是什么,是树二进制或一般树(任意数量的子),树的大小。

最常见的想法是从根目录开始运行DFS或BFS,以获取每个节点级别,然后创建一个集合列表,其中每个集合包含单个级别的节点。该集可以是任何结构,标准列表都可以。

假设您正在使用C ++工作,如果您需要性能(甚至比C更好),即使不是最佳实用选择也是好的。

假设我们有一个通用树,输入结构是你提到的邻接列表。

//nodes are numbered from zero to N-1
vector<vector<int>> adjList;

然后运行BFS或DFS,或者为树执行,为每个节点保持一个级别。下一个节点的级别是它的父级加一级。

一旦发现了关卡,就可以像这样放置节点。

vector<vector<int>> nodesPartitionedByLevels(nodeCount);
//run bfs here
//inside it you call
nodesPartitionedByLevels[level].push_back(node)

关于它。

然后当你有级别时,你迭代该级别上的所有节点,并检查adjaceny列表是否包含任何节点。

基本上你打电话给adjList[node].empty()。如果为真,则为叶节点。