我只是在玩一棵二叉树,我很好奇为什么第一个实现有效,而第二个却没有。我在看什么?我认为这是微不足道的,但我仍然想念它。
1:
//just a wrapper around the insertTree method.
public void insertKey(int key){
if(root==null) //a private 'Node' variable.
root = new Node(key);
else
insertTree(key, root);
}
//recursive insert - working
private void insertTree(int key, Node node)
{
if(key <= node.getKey())
{
if(node.left!=null)
insertTree(key, node.left);
else
node.left = new Node(key); //explicitly setting left child
}
else
{
if(node.right!=null)
insertTree(key, node.right);
else
node.right = new Node(key); //explicitly setting right child
}
}
不工作的变体:
2:
private void insertTree(int key, Node node)
{ //if node is null, create a new node. Can be either node.left or node.right
if(node==null)
{
node = new Node(key);
return;
}
else
if(key <= node.getKey())
insertTree(key, node.left);
else
insertTree(key, node.right);
}
Node 只是一个具有公共left, right
成员和单个int key
数据成员的简单类。没有什么花哨。所以#1 工作得很好,中序遍历产生了一个排序的输出。现在,#2 似乎不起作用。根是唯一被初始化的,它的左/右子节点继续为空。所以如果我确实node.left
作为参数传递,为什么递归方法调用不为其分配一个新节点?我在这里想念什么?Java 是通过引用传递的(即引用值),所以我猜这应该可行,但也许我在这里遗漏了一些菜鸟。