Recursion 二叉树-在一个级别上计算节点数
我正在编写一个二叉树类,我被一个levelCount方法卡住了,在这个方法中,我需要计算树的一个级别上的节点数。类和方法如下所示:Recursion 二叉树-在一个级别上计算节点数,recursion,binary-search-tree,Recursion,Binary Search Tree,我正在编写一个二叉树类,我被一个levelCount方法卡住了,在这个方法中,我需要计算树的一个级别上的节点数。类和方法如下所示: public class ConsTree<T> extends BinaryTree<T> { BinaryTree<T> left; BinaryTree<T> right; T data; public int levelCount(int level) { } }
public class ConsTree<T> extends BinaryTree<T>
{
BinaryTree<T> left;
BinaryTree<T> right;
T data;
public int levelCount(int level)
{
}
}
public类ConsTree扩展二进制树
{
左二叉树;
二叉树右;
T数据;
公共整数级计数(整数级)
{
}
}
因此,每个树的左侧有一棵树,右侧有一棵树,还有数据。有一个抽象类binarytree和子类Constee和EmptyTree
我想我需要使用广度优先搜索,并在到达该级别后计算节点的数量,但我仍停留在如何开始的问题上。这里的任何指导都会有所帮助。我可以提供任何其他必要的信息 以下是一般方法 您完全按照通常的方式(按顺序,深度优先)遍历树,但也可以使用伪代码向下传递所需的和实际的级别,例如:
def getCountAtLevel (node, curr, desired):
# If this node doesn't exist, must be zero.
if node == NULL: return 0
# If this node is at desired level, must be one.
if curr == desired: return 1
# Otherwise sum of nodes at that level in left and right sub-trees.
return getCountAtLevel (node.left, curr+1, desired) +
getCountAtLevel (node.right, curr+1, desired)
#######################################################################
# Get number of nodes at level 7 (root is level 0).
nodesAtLevel7 = getCountAtLevel (rootNode, 0, 7)
它实际上不会遍历整个树,因为一旦它达到所需的级别,它就可以忽略它下面的所有内容。下面是一个完整的C程序,它显示了这一点:
#include <stdio.h>
typedef struct _sNode { struct _sNode *left, *right; } tNode;
// Node naming uses (t)op, (l)eft, and (r)ight.
tNode TLLL = {NULL, NULL }; // level 3
tNode TLLR = {NULL, NULL };
tNode TRLL = {NULL, NULL };
tNode TRLR = {NULL, NULL };
tNode TRRR = {NULL, NULL };
tNode TLL = {&TLLL, &TLLR }; // level 2
tNode TRL = {&TRLL, &TRLR };
tNode TRR = {NULL, &TRRR };
tNode TL = {&TLL, NULL }; // level 1
tNode TR = {&TRL, &TRR };
tNode T = {&TL, &TR }; // level 0 (root)
static int getCAL (tNode *node, int curr, int desired) {
if (node == NULL) return 0;
if (curr == desired) return 1;
return getCAL (node->left, curr+1, desired) +
getCAL (node->right, curr+1, desired);
}
int main (void) {
for (int i = 0; i < 5; i++) {
int count = getCAL(&T, 0, i);
printf ("Level %d has %d node%s\n", i, count, (count == 1) ? "" : "s");
}
return 0;
}
如果编译并运行该代码,您将看到它在每个级别上提供了正确的节点计数:
Level 0 has 1 node
Level 1 has 2 nodes
Level 2 has 3 nodes
Level 3 has 5 nodes
Level 4 has 0 nodes
有没有更有效的方法?通过使用这种方法,我们必须始终从顶部遍历到所需的级别。@thanhbinh84,如果您只有向下的指针,那么这是最有效的方法。如果您允许修改数据结构,您可以添加兄弟指针,这些指针可以使事情对该特定任务效率更高,代价是使更新更贵一些。每一个都指向他们的孩子,同时也指向它右边的
X
(在同一级别上)(当然,行上的最后一个X
指向NULL)。(续)。。。。。。(续)您仍然需要找到给定级别(可能在任何位置)的起始节点,但从那时起,它只是在兄弟节点之后。如果需要,您可以在每个给定级别上存储第一个节点的指针,以提高效率。谢谢@paxdiablo,您是对的。我正在考虑为每个级别或类似的事情存储节点,这样计数或搜索将更有效。奇怪的是,很难在互联网和一些算法书籍上找到解决方案。不需要两个参数:Curr和desired,只有一个就足够了(每次调用时将desired减少1,当它达到0时,这就是您想要的级别)。使用递归函数推送多个参数可能会很麻烦。
Level 0 has 1 node
Level 1 has 2 nodes
Level 2 has 3 nodes
Level 3 has 5 nodes
Level 4 has 0 nodes