如何从二叉树中打印出连续编号的节点值?

How to print out Node Values from BinaryTree with continuing number?

我正在尝试遍历二叉树并在每个节点前面打印出 节点值 匹配数字 。为了更好地理解: 我在调用我的方法时打印出 以下行

  1. 11, 2.33, 3.10, 4.14, 5.27, 3.31, 4.32

其中 我的目标 与方法是 打印出完全相同的节点顺序 但是前面有一个递增的数字,这应该表示顺序。 像这样:

  1. 11
  2. 33
  3. 10
  4. 14
  5. 27
  6. 31
  7. 32

知道我的方法是这样的:

public int mNr(Node k, int Nr) {
        //If the current Node is null, return 0 (currently not making any use of the return)
        if(k == null) {
            return 0;
        } else {
            //If the left Side is not null print out the Left Node with Value 
            if(k.left != null) {
                //increment Nr each time priniting
                System.out.println("Nr: " + ++Nr + " " + k.left.number);
            }
            if(k.right != null) {
                //Same as left Side
                System.out.println("Nr: " + ++Nr + " " + k.right.number);
            }
            //Calling the Method and not incrementing the Nr Parameter because 
            //already incrementing it in the print Statements
            return mNr(k.left, Nr) + mNr(k.right, Nr);
        }
    }

我也不太确定如何使用int -return,即使知道我没有使用它。 获得正确输出的任何建议都会有所帮助。

Returns 用于使方法的结果可用于程序中的进一步评估。 在这种情况下,调用 mNr 的方法可以使用 0 的 return 来知道节点是空的,因此为这种情况产生更合适的输出。

由于每个递归调用都有自己的 Nr 变量,因此它们并不总是具有相同的值。如果在更深层次的递归中,Nr 递增,这不会影响调用者的 Nr.

版本

正如您似乎已经暗示的那样,您可以使用 return 值向调用者传达 Nr 的最新值是什么,以便调用者可以更新自己的 Nr 变量,或调用者随意使用它。

这里更正:

public int mNr(Node k, int Nr) {
    if(k == null) {
        return 0;
    } else {
        if(k.left != null) {
            System.out.println("Nr: " + ++Nr + " " + k.left.number);
        }
        if(k.right != null) {
            System.out.println("Nr: " + ++Nr + " " + k.right.number);
        }
        // Use the return value from the left-recursion to feed the right-recursion
        return mNr(k.right, mNr(k.left, Nr));
    }
}

话说回来,这个遍历还有一些其他的问题:

  • 根节点不包含在输出中
  • 遍历有一个特殊的顺序:它是深度优先和广度优先的混合。选择更流行的遍历更有意义,比如前序遍历(先父,然后左子树,然后右子树)

因此这导致以下替代代码:

static public int mNr(Node node, int Nr) {
    if (node == null) {
        return Nr;
    }
    System.out.println("Nr: " + ++Nr + " " + node.number);
    return mNr(node.right, mNr(node.left, Nr));
}