作为编程练习,我需要重写一些构成二叉树的现有方法和类。 (方法签名和构造函数必须保持不变)。不知何故,我似乎并不理解我在这里做了什么。
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;
}
答案 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
)初始化Node
和val
,当您打印它时,您会看到null
为空val
的{{1}}:
Node
仅当您Node(Integer val) {
this.val = val;
left = new Node(null);
right = new Node(null);
}
为val
时才有效。
您的代码中还有一个错误:
Integer
将val = 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()
的树。