我刚刚学习了二叉树,我尝试创建一个插入方法。我的第一种方法不起作用,我做了一些调整。它现在有效,但我不明白为什么以前的方法失败了。
不起作用的方法是:
if(root == null)
{
root = new Node(data);
}
else if(data < root.getData())
{
insertNode(root.getLeft(), data);
}
else
{
insertNode(root.getRight(), data);
}
有效的方法是:
if(data < root.getData())
{
if(root.getLeft() == null)
{
root.left = new Node(data);
}
else
{
insertNode(root.getLeft(), data);
}
}
else
{
if(root.getRight() == null)
{
root.right = new Node(data);
}
else
{
insertNode(root.getRight(), data);
}
}
有关为何会出现这种情况的任何解释?因为我看到它的方式,root应该等于root.left,所以将root设置为新节点应该与将root.left / right设置为新节点相同。
答案 0 :(得分:2)
在第一个方法中,您将null赋入insertNode方法,但没有引用指针。因此,您在insertNode方法中设置root = new Node(),但父节点不知道任何此类,它仍然指向null。
由于这是一些非常基本的Java理解,我建议阅读一些关于“java参数传递”的文章,例如: http://javadude.com/articles/passbyvalue.htm
答案 1 :(得分:0)
假设您递归地调用该方法insertNode(root, data)
,您必须确保root
不是null
,这意味着执行root = new Node(data);
会创建一个可见性为限于insertNode
方法。
如果没有,您可以将insertNode(data)
重写为非递归,并在其root
内创建null
。
public void insert(int data) {
if(root == null){
root = new Node(data);
}
else {
Node current = root;
Node previous;
String from;
while(current != null) {
previous = current;
if(data < current.getData()) {
current = current.left();
from = "left";
}
else {
current = current.right();
from = "right";
}
}
current = new Node(data);
if(from.equals("left")) {
previous.left() = current;
} else {
previous.right() = current;
}
}
}