树数据结构addnode

时间:2016-08-03 01:48:56

标签: java tree

我在理解以下代码时遇到了问题。它是一个树数据结构,我不明白为什么我们在focusnode方法中需要两个节点(父节点和addnode())。我试着用focusnode来做这件事,但它没有成功。我的想法是将focusnode设置为root,并保持循环直到focusnode等于null,并将focusnode设置为newnode

public class tree {
  node root;
public class node{

    private int key;
    private node left;
    private node right;

    node(int key){
        this.key = key;     
}

    public int getkey(){
        return key;
    }

    public node getleft(){
        return left;
    }

    public node getright(){
        return right;
    }

}

public void addnode(int key){
    node newnode = new node(key);
    if(root == null){
        root = newnode;
    }else{
        node focusnode = root;
        node parent;

        while(true){

            parent = focusnode;
            if(key < focusnode.key){
                focusnode = focusnode.left;

                if(focusnode == null){
                    parent.left = newnode;
                    return;
                }
            }else{
                focusnode = focusnode.right;

                if(focusnode == null){
                    parent.right = newnode;
                    return;
                }


        }
        }
    }
}
public void runnode(node focusnode){
    if(focusnode != null){
        runnode(focusnode.left);        

    runnode(focusnode.right);
    System.out.println(focusnode.key);
    }

}`

2 个答案:

答案 0 :(得分:0)

因为如果您需要将新节点指定为parent的{​​{1}}或.left子节点(在您发现.right ...意味着{{ 1}} / focusnode == null为null),那么您需要对.left parent.right .right parent.left`的引用。

因此,您需要将.left/.right child (the reference is from the parent). You can't set focusnode to your newnode, because it will only assign your newnode to focusnode and not to引用设置为or,但父级的focusnode / newnode子节点不会引用您的.left。< / p>

如果您来自C / C ++或类似的,请想象所有这些变量都是指针。 .right指向newnode指向的同一对象。将*focusnode指向其他对象不会更改*parent.left指向的内容。

Java中的所有变量都是引用(除了int / double之类的原语之外),它们类似于C / C ++中的指针。

答案 1 :(得分:0)

如果你正在做这样的检查:

if(key < focusnode.key){
    focusnode = focusnode.left;
        if(focusnode == null){
            focusnode = newnode;
            return;
        }
    }
}

您正在循环直到focusnode为null,然后创建新节点,但不将其附加到父节点。因此,当您尝试再次循环时,您无法循环通过根节点,因为它没有子节点!如果您希望避免处理父节点变量,则需要在设置focusnode之前检查条件中的子节点,并且如果子节点不为null,则仅设置focusnode。 e.g:

if(key < focusnode.key){
        if(focusnode.left == null){
            focusnode.left = newnode;
            return;
        } else {
            foucusnode = focusnode.left;
        }
    }
}

右侧的检查是相同的。