【问题标题】:How to add to a Binary Search Tree without using a Node class如何在不使用节点类的情况下添加到二叉搜索树
【发布时间】:2020-03-15 14:22:49
【问题描述】:

对于类,我需要创建自己的二叉搜索树实现,包括搜索、添加、删除和 toString 方法,但如果不先添加,我无法尝试这些方法。我不允许编写或使用节点类。我的树的每个节点都应该是 BinarySearchTree 类的一个实例。我无法弄清楚如何在没有典型节点的情况下遍历树。这是我的第一部分代码:

public class BinarySearchTree<E extends Comparable<E>> implements BinarySearchTreeInterface<E> {
    E value;
    BinarySearchTree<E> parent;
    BinarySearchTree<E> left;
    BinarySearchTree<E> right;
    static String draw;

    public BinarySearchTree() {
        value = null;
        parent = null;
        left = null;
        right = null;
    }

    @Override
    public void add(E item) {
        if (isRoot() && value == null) {
            value = item;

        } else if (value.compareTo(item) > 0) {
            if (right != null) {
                add(right.value);
            } else {
                BinarySearchTree<E> newNode = new BinarySearchTree<E>();
                newNode.value = item;
                newNode.right = newNode;    
            }
        }else if (value.compareTo(item) < 0) {
            if (left != null) {
                add(left.value);
            }
          } else {
            BinarySearchTree<E> newNode = new BinarySearchTree<E>();
            newNode.value = item;
            newNode.left = newNode;
        }
    }

这似乎只添加了 5 的根值。我相信这与未将新“节点”连接到父节点或我的构造函数有关。我正在努力遍历树并在不使用节点类的情况下连接“节点”。

【问题讨论】:

  • 尝试使用 right.add(item);和 left.add(item) 而不是 add(left.value);
  • 我刚刚注意到您有一个名为 isRoot() 的方法,但您没有包含它......它是如何工作的?
  • @LowKeyEnergy 它检查 if(parent == null);根没有父节点,因此如果节点是根,则返回 true。修复递归语句后,代码现在可以工作了。

标签: java generics binary-search-tree add


【解决方案1】:

这样看……二叉树的每个节点本身就是一棵二叉树。

如果你认为这两者是等价的,那么你的 BinarySearchTree 类实际上是一个 Node 类......它只是没有命名为“Node”。

任何时候您想使用Node 类的对象,只需将其声明为BinarySearchTree 即可。

而不是:

Node left;
Node right;

你将拥有:

BinarySearchTree left;
BinarySearchTree right;

顺便说一句,你缺少的是:

this.left = newNode;

this.right = newNode;

这意味着BinarySearchTree正在设置left本身right变量。这就是this 的意思。

事实证明,this 甚至没有必要,除非在某些情况下上下文不明确。在你的情况下,你可以说:

left = newNode;

right = newNode;

【讨论】:

  • 谢谢!我已经意识到我没有将左右设置为我的新节点,但似乎我将该语句添加到我的 add 方法中的任何位置都会导致 StackOverflowError。
  • 堆栈溢出表示无限递归正在发生。每当您进行递归调用时,您都需要确保您所做的调用所解决的“问题”比您所在的递归调用更小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 2021-02-26
相关资源
最近更新 更多