【问题标题】:Why wont my Binary Search Tree display more then 3 nodes?为什么我的二叉搜索树不显示超过 3 个节点?
【发布时间】:2017-01-25 22:45:46
【问题描述】:

我的二叉搜索树似乎无法管理超过 3 个节点或无法显示它们。我需要迭代地添加它们并在分配中使用堆栈显示它们,但是如果 BST 有超过 3 个元素,则无法显示它们。

public boolean add(E b) {

    //if tree is empty
    if (root == null) {
        root = new Node();
        root.setValue(b);
        count++;
        return true;
    } //if val is already in tree
    else if (b.compareTo(root.getValue()) == 0) {
        return false;
        //if left or right spot is free
    } else {
        while (root != null) {
            compareResult = root.value.compareTo(b);
            spot = root;
            if (compareResult < 0) {
                if (root.left != null) {
                    spot = spot.left;
                    count++;
                    return true;
                } else {
                    Node n = new Node<>();
                    n.setValue(b);
                    spot.left = n;
                    count++;
                    return true;
                }
            } else if (compareResult > 0) {
                if (root.right != null) {
                    spot = spot.right;
                    count++;
                    return true;
                } else {
                    Node n = new Node<>();
                    n.setValue(b);
                    spot.right = n;
                    count++;
                    return true;

                }
            } else {
                return false;
            }
        }
    }
    return false;

}

public void display() {
    //needs to use an iterator
    if (root == null) {
        System.out.println("Error");
    } else {
        Node CurrentNode;
        CurrentNode = root;
        while (!stack.isEmpty() || CurrentNode != null) {
            if (CurrentNode != null) {
                stack.push(CurrentNode);
                CurrentNode = CurrentNode.right;


            }
            else {
                Node m= stack.pop();
                System.out.println(m.value);
                CurrentNode = m.left;
            }

        }
    }
}

public int size() {
    return count;
}

@Override
public int compareTo(E t) {
    return ordering.compare(root,t);
}

@Override
public int compare(E t, E t1) {
    return t.compareTo(t1);
}

Node 类如下所示

public class Node<E extends Comparable> {

E value;
Node<E> left;
Node<E> right;

//constructor
public Node() {
    value = null;
    left = null;
    right = null;


}

public void setValue(E t) {
    value = t;
}

public void setLeft(Node<E> t) {
    left = t;

}

public void setRight(Node<E> t) {
    right = t;
}

public Node<E> getLeft() {
    return left;
}

public Node<E> getRight() {
        return right;
}

public E getValue() {
    return value;
}

【问题讨论】:

  • 这不是一个完整的答案,因为我不会为你做作业。但基本上,您的 add 方法需要是递归的。事实上,它只在节点的根节点、左孩子或右孩子添加东西。您的大部分逻辑都可以删除,因为如果您插入的值 小于 根处的值,您可以再次调用 add 并传递左侧的节点。如果它大于根的值,您可以再次调用add,传递右侧的节点。您缺少此递归步骤。
  • 如何递归调用它? BST 中的大多数对象都是 Node 对象,所以我不能再调用 add 了。我只能在 E 上调用 Add ,然后我不知道如何结束程序。
  • 您有几个选择。您可以将add 方法放在Node 类中。然后Tree 类中的add 方法将检查Node 是否存在,如果存在则在该Node 上调用add。或者,您可以使 Node 类中的 leftright 实际上是树,而不仅仅是节点。
  • 我本来是为了node类里面有add方法,但是老师说node类应该只包含对左右的引用。除此之外,她在课堂上指示做一些类似于我在 add 方法中所做的事情,并说我们不应该使用递归。我觉得自己真的被困住了,Node 课程正是她指示我们制作的方式。
  • 你的老师说你不应该使用递归?这很奇怪。递归是正确的方法。我想你可以使用一个巨大的循环,当你找到正确位置的父节点来添加节点时,它会沿着树向下并退出。我可以看到这就是您尝试做的事情,但是您的条件 while(root != null) 是错误的,因为一旦您到达 else 子句,root 将始终不为空。

标签: java stack binary-search-tree iterable


【解决方案1】:

我可以看到您需要进行一些更改。

add 方法中的} else { 行之后,您应该交换接下来的三行,以拥有

  spot = root;
  while (spot != null) {
        compareResult = spot.value.compareTo(b);

因为spot 将在您迭代循环时沿着树向下追踪。但是因为您当前使用的是root 而不是spot,所以您总是将值与root 节点而不是较低的节点进行比较。

另外,从spot = spot.left;spot = spot.right; 之后删除count++;return true;,因为在这些情况下,您实际上并没有向树中添加任何内容,因此您需要继续循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多