我正在尝试为树中的每个叶子分配数字。
例如,如果我们有一个有6片叶子的树,我希望叶子的数字从0到5。
我不知道为什么我的代码不能很好地工作,我甚至以递归的方式尝试了很多次,但似乎我错过了一些东西..
public class Node {
int index;
int id;
Node left;
Node right;
// Constructor and setters/getters.
public static void num(Node n) {
int ini=0;
if(n==null)
{
}
if(n.isLeaf())
{
n.index=ini;
ini++;
}
if(!n.isLeaf())
{
num(n.getleft());
num(n.getRight());
}
}
此外,我想获得树中叶子的数量。
例如,我们的树看起来像
1
/ \
2 3
/ \ / \
6 9 8 10
/
4
public static int numberChild(Node n, int count)
{
if (n == null) {
return 0;
}
if (n.getleft() == null && n.getRight() == null) {
return 1 + count;
} else {
int lc = numberChild(n.getleft(), count);
int rc = numberChild(n.getRight(), lc);
return rc;
}
}
会给我一个错误的叶子数,2而不是4!
任何帮助?
答案 0 :(得分:1)
如果n == null
您返回0.您应该返回count
或您先前的计数丢失。在您为6节点计算离开时的示例中,您正确地从它下面的4节点获得1。然后为不存在的右子项调用numberChild()
,它返回0,因此为6节点返回的计数为0,而不是1.
编辑:要为叶子分配值我相信你应该使用与计算节点相同的想法,将计数传递给递归方法,这样它就知道有多少叶子已经编号到当前的左边节点,并返回更新的计数。您num
方法将类似于numberChild
方法的另一个版本,通过为叶节点分配新索引进行扩展。