为树中的叶子分配不同的值

时间:2016-12-01 04:58:12

标签: java recursion data-structures tree nodes

我正在尝试为树中的每个叶子分配数字。

例如,如果我们有一个有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!

任何帮助?

1 个答案:

答案 0 :(得分:1)

如果n == null您返回0.您应该返回count或您先前的计数丢失。在您为6节点计算离开时的示例中,您正确地从它下面的4节点获得1。然后为不存在的右子项调用numberChild(),它返回0,因此为6节点返回的计数为0,而不是1.

编辑:要为叶子分配值我相信你应该使用与计算节点相同的想法,将计数传递给递归方法,这样它就知道有多少叶子已经编号到当前的左边节点,并返回更新的计数。您num方法将类似于numberChild方法的另一个版本,通过为叶节点分配新索引进行扩展。