如何从二叉树中打印出连续编号的节点值?
How to print out Node Values from BinaryTree with continuing number?
我正在尝试遍历二叉树并在每个节点前面打印出 节点值 和 匹配数字 。为了更好地理解:
我在调用我的方法时打印出 以下行:
- 11, 2.33, 3.10, 4.14, 5.27, 3.31, 4.32
其中 我的目标 与方法是 打印出完全相同的节点顺序 但是,前面有一个递增的数字,这应该表示顺序。 像这样:
- 11
- 33
- 10
- 14
- 27
- 31
- 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));
}
我正在尝试遍历二叉树并在每个节点前面打印出 节点值 和 匹配数字 。为了更好地理解: 我在调用我的方法时打印出 以下行:
- 11, 2.33, 3.10, 4.14, 5.27, 3.31, 4.32
其中 我的目标 与方法是 打印出完全相同的节点顺序 但是,前面有一个递增的数字,这应该表示顺序。 像这样:
- 11
- 33
- 10
- 14
- 27
- 31
- 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));
}