我的二传手没有设定

时间:2015-11-08 15:06:52

标签: java data-structures binary-search-tree getter-setter

所以我试图实现BST(二进制搜索树)我已经制作了一个添加方法,将TreeNodes添加到树[TreeNode]数组

这是TreeNode类,我正在尝试设置父节点以及左节点和右节点,我使用调试器进行检查,但我不确定原因,但它没有设置Parent var,也只是在leftChild和rightChild字段中添加一个或另一个。

有问题的二传手就是这个

//set parent
public void setParent(TreeNode t)
{
    this.parent = t.parent;
}

我无法理解当我从PAS43DEPQ类调用它时,它没有正确设置。

class TreeNode implements Comparable<TreeNode>
{
    private Integer value;
    private TreeNode leftChild;
    private TreeNode rightChild;
    private TreeNode parent;

    //constructors
    public TreeNode(){}
    public TreeNode(Integer v){this.value  = v;}
    public TreeNode(TreeNode t){
        this.value = t.value;
        this.parent = t.parent;
        this.leftChild = t.leftChild;
        this.rightChild = t.rightChild;
    }
    public TreeNode (Comparable c){this.value = (int) c;}

    //set parent
    public void setParent(TreeNode t)
    {
        this.parent = t.parent;
    }
    //get parent
    public TreeNode getParent()
    {
        return this.parent;
    }
    //get value
    public int getValue(){return value;}
    //set value
    public void setValue(Integer i){ this.value = i;}
    //get left node
    public TreeNode getLeftChild(){return leftChild;}
    //get right node
    public TreeNode getRightChild(){return rightChild;}
    //set left child
    public void setLeftChild(TreeNode t) {this.leftChild = t;}
    //set right child
    public void setRightChild(TreeNode t) {this.rightChild = t;}

    public TreeNode find(int n)
    {
        //this statement runs if the current node is == the value being searched.
        if(this.value == n)
            return this;
        //this returns values left of the root then performs a recursive call if not found
        if(value < this.value && leftChild != null)
            return leftChild.find(n);
        //this does the same as above except looks on the right side of the root
        if(rightChild != null)
            return rightChild.find(n);

        //this returns if value is not found
        return null;
    }

    @Override
    public int compareTo(TreeNode o)
    {

        if (this.value == o.value)
        {
            return 0;// if value equal
        }
        if (this.value > o.value) //if value greater
        {
             return 1;
        }
        if (this.value < o.value)
        {
            return -1;   //if value less
        }
        return 99;
    }
}

以下是我添加的课程:

public class PAS43DEPQ implements DEPQ
{
    private TreeNode[] tree = new TreeNode[100];
    int index = 0;

    @Override
    public Comparable inspectLeast() {
        return null;
    }

    @Override
    public Comparable inspectMost() {
        return null;
    }

    /*
    right: (2 * n) + 2
    left: (2 * n) + 1
    parent: (1 - n) / 2
     */

    public int right()
    {
        return (2 * index) + 2;
    }

    public int left()
    {
        return (2 * index) + 1;
    }

    public int parent()
    {
        return Math.round((index  - 1) / 2);
    }

    @Override
    public void add(Comparable c)
    {
        // Root node
        if (tree[0] == null) {
            tree[0] = new TreeNode(c);
            return;
        }

        //this while loop is for tree traversal
        while(tree[index] != null) {
            if( c.compareTo(tree[index].getValue()) == 0) {
                index += right() - index;
                continue;
            }

            if( c.compareTo(tree[index].getValue()) > 0) {

                index += right() - index;
                continue;
            }

            if( c.compareTo(tree[index].getValue()) < 0) {
                index += left() - index;
                continue;
            }

        }

        //this part is for place the new node
        if(tree[index] == null) {
            tree[index] = new TreeNode(c);
            tree[index].setParent(tree[parent()]);

            if( c.compareTo(tree[index].getValue()) == 0)
                tree[parent()].setRightChild(tree[index]);

            if( c.compareTo(tree[index].getValue()) > 0)
                tree[parent()].setRightChild(tree[index]);

            if( c.compareTo(tree[index].getValue()) < 0)
                tree[parent()].setLeftChild(tree[index]);


            index = 0;
        }

        return;
    }

    @Override
    public Comparable getLeast() {
        return null;
    }

    @Override
    public Comparable getMost() {
        return null;
    }

    @Override
    public boolean isEmpty() {
        return (tree[0] == null) ? true : false;
    }

    @Override
    public int size() {
        return tree.length;
    }
}

我无法解决为什么父母没有被设置为该线 "tree[index].setParent(tree[parent()])"

正在被召唤?关于为什么会发生这种情况的任何想法?

1 个答案:

答案 0 :(得分:1)

set方法应该是这样的

//set parent
public void setParent(TreeNode t)
{
    this.parent = t;
}

此方法将TreeNode作为this引用的当前节点的父级。

您正在使用的语句将TreeNode t的父项设置为当前节点的父项。