【发布时间】:2021-12-23 05:27:32
【问题描述】:
我需要知道一棵树有多少叶子,但有一些条件。
- 所有的孩子或叶子,总是在同一个级别,但它可以是级别 1,2,3,4,5 ...我不知道会是哪一个。所以你不能计算孙子+孙子...他们将处于同一级别并且将是他们中较低的,在这种情况下:孙子。
- 必须有一个没有叶子的节点,但如果它不是最底层的叶子,则不必算叶子。
我会尝试用一些例子来解释自己。想象一下你有这棵树:
A
|- B
| |- B1
| |- B2 Number of 'leafs' = 2 (B1 and B2). C doesn't count as it is in an
| upper level)
|- C
另一个例子:
A
|- B
| |- B1
| |- B2 Number of 'leafs' = 3 (B1,B2,D1)
|
|- C
|- D
|-D1
另一个例子:
A
|- B
| |- B1
| | |-B11
| |- B2 Number of 'leafs' = 1 (B11). D1 is not a leaf. It is a 'node' as
| leafs in this case are in level 4 (counting A as 1)
|- C
|- D
|-D1
我正在使用类似于 QTreeWidgetItem 的 C++ 和 Qt,所以我有一个对象(我们称它为 myTree,我可以问类似:myTree->childCount() 所以在第一个示例中,如果我调用它,它会说2(B和C),每一个我都可以重复操作。
我试图计算所有给我 childcount() 的东西,但是它给了我 4(B、C、B1 和 B2)而不是 2(B1、B2),这就是我想要的......我把我在尝试什么:
int grandchild = 0;
for (int i = 0; i < myTree->childCount( ); ++i)
{
Obj* child = myTree->child( i ); //Get the children. First time will be B and C
if (child)
{
grandchild += p_child->childCount( ); // Here I wanted to get a total, for first example, I will get 3 which is not what I want
}
}
提前谢谢你。
【问题讨论】:
-
您希望每个节点报告其子节点中最远的叶子距离以及该距离处的叶子数量。递归调用它以获得您的答案。你有什么问题?
-
如果你要接近“孙子”,那你已经走得太远了。
-
@JohnFilleau '报告最远的叶子距离,' 哦..我没想到那个选项!谢谢!关于递归,需要检查怎么做:)为什么你认为孙子太远了?它可能是一棵有 10 层的树......(希望不是呵呵)
-
在处理递归算法时,递归的当前迭代应该只关心它自己,以及它“下面”的东西。给定节点上的这个操作应该只使用相同的操作检查它的子节点,并返回结果。它应该只关心它的孩子。如果一个节点开始关心它的孙子节点,那么你就是在让自己变得更加困难。
-
可能是因为不需要跟踪三个级别的节点。仅跟踪父项和子项即可轻松计算树高。例如,二叉树的递归树高度类似于
int get_height(Node * current) { if (!current)return 0; return 1+ max(get_height(current->right), get_height(current->left));对于非二叉树,您可以扩展以获得任意数量的子树的最大值,并且您必须为自己的额外特殊规则添加逻辑。
标签: c++ algorithm qt tree qtreewidget