创建没有数组的二进制搜索树

时间:2015-11-17 17:54:21

标签: java binary-search-tree

所以我设法使用数组在Java中制作BST,但是一位朋友告诉我他已经完成了使用数组。我大致知道他是如何做到的这里是一个例子(我遗漏了构造函数和getter和setter):

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

正如您所看到的,您可以链接左侧和右侧节点,但这让我了解了add方法的工作原理。到目前为止,我刚刚初始化了一个像这样的新对象:

public void add(Comparable c)
{
    TreeNode node = new TreeNode(c);
}

但是,如果我无法像在数组中一样访问它,我想知道如何链接到前一个对象?每当我去链接一个对象时,我最终会添加一个新对象。我对如何实现这个方法感到困惑,你会怎么做?

1 个答案:

答案 0 :(得分:1)

我非常确定你要做的是类似于此的事情:

class TreeNode<T extends Comparable<T>> {
    private T value;
    private TreeNode<T> left;
    private TreeNode<T> right;
    private TreeNode<T> parent;

    public TreeNode(TreeNode parent, T value) {
        this.parent = parent;
        this.value = value;
    }

    public TreeNode<T> add(T t) {
        if(t.compareTo(value) < 0) {
            if(left == null) {
                left = new TreeNode(this, t);
                return left;
            } else {
                return left.add(t);
            }
        } else {
            if(right == null) {
                right = new TreeNode(this, t);
                return right;
            } else {
                return right.add(t);
            }
        }
    }

    public boolean find(T t) {
        if(t.equals(value)) {
            return true;
        } else {
            if(t.compareTo(value) < 0) {
                if(left == null) {
                    return false;
                } else {
                    return left.find(t);
                }
            } else {
                if(right == null) {
                    return false;
                } else {
                    return right.find(t);
                }
            }
        }
    }
}

class Tree<T extends Comparable<T>> {
    private TreeNode<T> topElement;

    public TreeNode<T> add(T t) {
        if(topElement == null) {
            topElement = new TreeNode(null, t);
            return topElement;
        } else {
            return topElement.add(t);
        }
    }

    public boolean find(T t) {
        if(topElement == null) {
            return false;
        } else {
            return topElement.find(t);
        }
    }
}