我正在用java开发一个二叉搜索树。但我面临一些困难。这是代码
class Node {
Node left, right;
Integer data;
Node(Integer d, Node left, Node right) {
this.data = d;
this.left = left;
this.right = right;
}
}
class BinaryTree {
Node root;
public BinaryTree(Node root) {
this.root = root;
}
void insert(int d)
{
if(root==null)
root= new Node(d, null, null);
insert(root,d);
}
void insert(Node root, int d) {
if (root == null) {
root=new Node(d,null,null);
} else if (d > root.data) {
insert(root.right, d);
} else if (d < root.data) {
insert(root.left, d);
}
}
void inorder(Node root) {
if (root != null) {
inorder(root.left);
System.out.println(root.data);
inorder(root.right);
}
}
}
public class BST {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = null;
BinaryTree bt=new BinaryTree(null);
while (!(str = br.readLine()).equalsIgnoreCase("0")) {
bt.insert(Integer.parseInt(str));
}
bt.inorder(bt.root);
}
}
我面临的问题是在java中只有值传递。我在每种情况下都将root作为null,除了我已经将新创建的根传递给它的第一种情况。这里当我通过传递root的左边或右边的值来对insert函数进行递归调用时,然后在新调用中创建了新根,如果需要它,但是当函数超过它时#s; s值不会反映到调用者函数的变量中。 简而言之,问题是由于值跟随java的调用。
有人可以为这个问题建议解决方案吗?
答案 0 :(得分:4)
您对insert(root.right/left, d)
的调用如果它们为空,则不会更改原始的右/左节点,只需将方法参数指向一个新变量(正如您所注意到的那样)在Java中不会改变原始引用)。您对第一个根的更改是有效的,因为您调用了另一种方法insert(int)
。
您是否考虑过制作左右BinaryTree
而不是Node
?此外,不要使用“null”,而应考虑使用“空”BinaryTree(使用空根和isEmpty
方法)。
请注意,概念,左右是树,而不是节点,因此设计会更清晰。
示例代码。未经测试但这个想法应该是正确的:
class Node {
BinaryTree left, right;
Integer data;
Node(Integer d, BinaryTree left, BinaryTree right) {
this.data = d;
this.left = left;
this.right = right;
}
}
class BinaryTree {
Node root;
// Empty tree
BinaryTree() {
this(null);
}
BinaryTree(Node root) {
this.root == root;
}
void insert(int d) {
if (this.root == null) {
// The tree was empty, so it creates a new root with empty subtrees
this.root = new Node(d, new BinaryTree(), new BinaryTree());
} else if (d > this.root.data) {
this.root.right.insert(d);
} else if (d < this.root.data) {
this.root.left.insert(d);
}
}
}
注意:
答案 1 :(得分:1)
建议,
Integer
值,我不会使用int
。我会发布最简单的单元测试,任何人都可以重现,以及你在调试器中看到的内容,如果它没有任何意义。
这并没有真正回答你的问题,但是评论太长了。 ;)