如何避免二进制搜索树的字符串表示中的NULL?

时间:2014-06-24 15:00:36

标签: java binary-tree binary-search-tree

作为编程练习,我需要重写一些构成二叉树的现有方法和类。 (方法签名和构造函数必须保持不变)。不知何故,我似乎并不理解我在这里做了什么。

toString 方法是否必须公开,因为它会覆盖 Object 类的 toString 方法?我怎样才能避免返回空值?

以下是我到目前为止的代码:

树类

Node root = null;

void addNode(int val) {
        Node newNode = new Node(val);
        root = newNode.addNode(root, val);
    }

节点类

Node(int val) {
    val = val;
    left = null;
    right = null;
}

Node addNode(Node focusNode, int newNodeVal) {

    if (focusNode == null)
        return this;
    if (newNodeVal == focusNode.val)
        return focusNode;
    if (newNodeVal < focusNode.val)
        focusNode.left = this.addNode(focusNode.left, newNodeVal);
    else
        focusNode.right = this.addNode(focusNode.right, newNodeVal);

    return focusNode;
}

public String toString() {
    return this.left + " " + this.val + " " + this.right;
}

3 个答案:

答案 0 :(得分:2)

使用StringBuilder存储节点的String表示,并仅在特定节点null中附加子节点的数据。以下是在节点上使用infix navigation的示例:

public String toString() {
    StringBuilder sb = new StringBuilder();
    if (this.left != null) {
        sb.append(this.left);
        sb.append(' ');
    }
    sb.append(this.val);
    if (this.right != null) {
        sb.append(' ');
        sb.append(this.right);
    }
    return sb.toString();
}

答案 1 :(得分:1)

public String toString() {
    if(this.left==null){
        return this.val + this.right;
    } else if (this.right==null){
        return this.left + this.val;
    } else if (this.left == null && this.right == null){
        return "";
    } else {
        return this.left + " " + this.val + " " + this.right;
    }
}

您将节点指定为null以启动,并且您的toString方法假定它们已被更改。想象一下你添加了5,然后是3的树。然后在树上调用toString。它会尝试打印节点,5是值,左边是3,右边是null。当你试着打电话

return this.left + " " + this.val + " " + this.right;

你要打印

3 5 NULL

答案 2 :(得分:0)

您可以使用空left个对象(没有right)初始化Nodeval,当您打印它时,您会看到null为空val的{​​{1}}:

Node

仅当您Node(Integer val) { this.val = val; left = new Node(null); right = new Node(null); } val时才有效。

您的代码中还有一个错误: Integerval = val保持不变。您必须使用this.val

this.val = val;覆盖而非被覆盖。它必须返回toString(),如果您的String是一片叶子,则无法真正避免null

您可以做的是以Node toString()作为null这样的方式撰写val

public String toString() {
    return "#{val = " + val + ", left = " + left + ", right = " + right + "}"
}

请注意,这将以递归方式遍历您的树,以便打印您只需拨打root.toString()的树。