尝试打印时二进制搜索树的指针问题

Pointer issue with Binary Search tree when trying to print

我正在编写按顺序打印二叉搜索树的方法。我想出了一种方法来执行此操作,但它需要在打印时删除或取消节点。下面是我的代码:

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(未来的迭代也是如此)循环的 do not go down that tree) 并且如果可能的话向右移动或者绕着循环迭代回来。

尽管我无法使节点等于 null,因为当执行代码时(通过 junit 测试)代码不识别 null 键并通过该子树吗?任何人都可以帮助我或告诉我如何做到这一点,以便未来迭代中的 x.left 和 x.right 指针将节点识别为空吗?

您不需要取消或删除您需要遍历算法的节点。

此处提供的中序遍历无需大的修改即可工作: http://www.javabeat.net/binary-search-tree-traversal-java/

另一种面向对象的方法是提供给有序遍历的访问者,它允许您提供在每个节点执行的操作,无论是打印、收集、映射还是其他。