【问题标题】:Assigning distinct values to leaves in a tree为树中的叶子分配不同的值
【发布时间】:2017-04-15 15:16:11
【问题描述】:

我正在尝试为树中的每一片叶子分配编号。

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

有什么帮助吗?

【问题讨论】:

  • 您的树是否以任何方式排序,您是否希望按任何顺序分配标签?
  • 树没有排序,叶子是排序的,我们从左到右开始索引。这意味着我们需要一个反向波兰符号。
  • 我在你的代码中看不到任何错误。可以试试调试器吗?
  • 我没有得到关于“假设树不是二叉树”的部分。你的 Node 有两个后代,leftright,这对我来说听起来像是一棵二叉树。
  • @OleV.V.有错误。对于上面绘制的树,叶子的数量应该是 4,我只得到 3。但是如果节点 6 有 2 个叶子,输出会是正确的,但是当我们有一个只有 1 个叶子的节点时,我会出错输出。我编辑了我的帖子,我只想说树没有排序,这意味着我们可以让右孩子 n.right 填充而 n.left 不填充。

标签: java recursion data-structures tree nodes


【解决方案1】:

如果 n == null 你返回 0。你应该返回 count 否则你之前的计数会丢失。在您的示例中,当计算 6 个节点的叶子时,您正确地从其下方的 4 个节点获得 1。然后你为不存在的右孩子调用numberChild(),它返回0,所以你为第6个节点返回的计数是0,而不是1。

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

【讨论】:

  • 是的,我刚刚弄清楚并修改了我的代码。现在我太努力地从左到右为每个叶子分配值。对于上面的树,我想要 node4.index=0 node9.index=1 node8.index=2 node9.index=3
【解决方案2】:

刚刚发现我的分配索引代码出了什么问题

    public void num(Node n) {


        if(n.getleft()!=null)num(n.getleft());
        if(n.getRight()!=null)num(n.getRight());
        if(n.isLeaf())
        {
            n.assignIndex(ini);
            ini++;
        }

}

现在它运作良好:)。谢谢

【讨论】:

  • 感谢分享。所以你现在将ini 声明为字段而不是局部变量?
  • 是的,因为我认为当我将它作为函数中的局部变量时,每次调用递归时,它都会重新初始化为 0 ..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
相关资源
最近更新 更多