java - 我的 setter 未设置

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

所以我正在尝试实现 BST(二叉搜索树),我制作了一个 add 方法,将 TreeNodes 添加到树 [TreeNode] 数组

这是 TreeNode 类,我试图在其中设置父级以及左右节点,我用调试器进行了检查,我不知道为什么,但它没有设置 Parent var,而且也只是设置在 leftChild 和 rightChild 字段中添加其中之一。

有问题的 setter 就是这个

//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()])”

正在被调用吗?关于为什么会发生这种情况有任何想法吗?

最佳答案

set方法应该是这样的

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

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

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

关于java - 我的 setter 未设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33595408/

相关文章:

c - 节点内引用?

java - 我是否需要对不返回我关心的值的 Future 执行 future.get() ?

java - 在测验应用程序中设置 3 个难度级别

C++ 泛型链表独立类

database - 确定数据结构

c# - 为什么 List<T>.Add 和 List<T>.Remove 将元素复制到新数组中而不是实际添加和删除?

java - android 如何从数据库中删除第一个插入的项目

java - 从 Java 6 迁移到 Java 7 期间会发生什么

algorithm - 二叉搜索树是否可以仅由中序遍历构建?

python - 元组的二分查找