我正在编写方法以按顺序打印二叉搜索树。我想出了一种方法,但它需要在打印时删除或取消节点。以下是我的代码:
public String printKeysInOrder() {
String output = "";
if (isEmpty()) return "()";
else{
int i = 0;
while(i!=size()){
Node x = root;
int loopBreak = 0;
while(loopBreak!=1){
if(x.left != null) x = x.left;
else if (x.right != null){
output = output + " " + x.val;
x.key = null;
x = x.right;
i++;
}
else{
output = output + " " + x.val;
x.key = null;
loopBreak = 1;
}
}
i++;
}
}
return output;
}
树的:
_7_
/ \
_3_ 8
/ \
1 6
\ /
2 4
\
5
应打印“1 2 3 4 5 6 7 8”
代码以一种有利于向左移动直到它不能再向左移动的方式工作,然后它将该节点的值存储在字符串输出中,使得节点键等于null(如此将来的迭代循环不要沿着那个树向下移动)并尽可能向右移动或在循环中循环。
虽然我在制作它时遇到了麻烦,所以节点等于null,就像执行代码时一样(通过junit测试),代码无法识别该空键并且仍然通过该子树?任何人都可以帮我或者告诉我如何制作它,以便将来迭代的x.left和x.right指针将节点识别为null?
答案 0 :(得分:1)
您无需取消或删除需要遍历算法的节点。
此处提供的有序遍历应该无需重大修改即可运行: http://www.javabeat.net/binary-search-tree-traversal-java/
另一种面向对象的方法是提供给有序遍历的访问者,它允许您提供在每个节点执行的操作,无论是打印,收集,映射还是其他东西。