java打印inorder BST带括号

时间:2016-12-01 18:05:19

标签: java string binary-search-tree parentheses inorder

我想按照它们存储的顺序返回一个包含树中所有键的String。每个子树中的键应包含在括号中。

        _7_
      /     \
   _3_      8
 /     \
1       6
 \     /
  2   4
       \
        5

此BST的输出应为(((()1(()2()))3((()4(()5()))6()))7(()8()))。 我这样做的代码是:

public String printKeysInOrder() {
    if (isEmpty()) {
        return "()";
    }

    printInOrderRec(root);

    System.out.print(sb.toString());
    return sb.toString();
}

StringBuilder sb = new StringBuilder();

private String printInOrderRec(Node root) {
    if (root == null) {
        return null;
    }
    sb.append("(");
    printInOrderRec(root.left);
    sb.append("(");
    sb.append(")");

    sb.append(root.val);

    printInOrderRec(root.right);

    return null;
}

这给了我输出:(((()1(()2()3((()4(()5()6()7(()8。 我一直在研究这个问题多年,无法弄清楚在哪里以及如何追加缺失的括号。任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:0)

在进入编码解决方案之前,让我们尝试绘制如何生成输出

(--------------------------------7-------)
 (------------3-----------------) (--8--)
  (--1-------) (------------6--)   () ()
   () (--2--)   (--4-------) ()
       () ()     () (--5--)
                     () ()

这里每个括起来的括号都定义了一个call stack。我不是要描述每个调用堆栈,否则这个答案将是非常长的。但是,从图中我们可以在每个调用堆栈中找到5个部分。

  1. 左侧paranthesis
  2. 左撇子
  3. 正确的孩子
  4. 右副手
  5. 因此,您的printInOrderRec方法可能如下所示:

    private void printInOrderRec(Node root) {
        sb.append("(");
        if (root != null) {
            printInOrderRec(root.left);
            sb.append(root.val);
            printInOrderRec(root.right);
        }
        sb.append(")");
    }
    

    注意:我已经返回类型void,因为在您的代码中它只返回null。