当前位置: 首页 > 知识库问答 >
问题:

在java中获取二进制搜索树的根

丌官积厚
2023-03-14

我用java创建了一个二进制搜索树,允许用户向该树添加节点

这是我在java中实现的二叉树,它在创建时接受根节点,然后自动计算出它应该将子节点添加到树的左侧或右侧。

public class BinarySearchTree {

    Node root = null;
    public BinarySearchTree(Node root){
        this.root =root;
    }
    public void add(int data){
        Node newNode = new Node(data);
        if(this.root ==null){
            newNode =this.root;
        }
        if(data>this.root.data){
            addRight(root,newNode);
        }

        if(data<this.root.data){
            addLeft(root,newNode);
        }
    }

    public Node getRoot(){
       return  this.root;
    }

    private void addLeft(Node root, Node newNode) {
        if(root.leftChild == null){
            root.leftChild = newNode;
        }
        else {
            this.root = this.root.leftChild;
            add(newNode.data);
        }
    }

    private void addRight(Node root,Node newNode) {
        if (root.rightChild == null){
            root.rightChild = newNode;
        }
        else {
            this.root = this.root.rightChild;
            add(newNode.data);
        }
    }

}

但是当我尝试使用getRoot()方法检索根节点时。它返回根的子节点,而不是我传入的实际根节点。

这是一个使用它的例子

TreeHight treeHight = new TreeHight();
        Node root = new Node(100);
        BinarySearchTree unbalance = new BinarySearchTree(root);
        unbalance.add(200);
        unbalance.add(50);
        unbalance.add(250);
        unbalance.add(350);

当我尝试获取根节点时,它给我250作为第一个节点,而不是100

如何检索此树的根节点?


共有2个答案

魏鸿禧
2023-03-14

您正在编辑这一行的根:

this.root = this.root.rightChild;

我认为您应该像这样递归地将新节点添加到右侧:

    else {
        addRight(this.root.rightChild, newNode);
    }

请注意,我认为您在这个块“add方法”中遇到了问题:

   if(this.root ==null){
        newNode =this.root; // it should be this.root = newNode;
    }
申高卓
2023-03-14

您可以在代码中编写:

 this.root = this.root.leftChild;
 add(newNode.data);

这大概是错误的行为吧?

您应该将其改写为:

add(this.root.leftChild,newNode);

然后定义一个递归方法,该方法查看该项是否应存储在子轨迹的左/右。

类似的东西:

public void add(Node subroot, int data){
    if(data > subroot.data){
        addRight(subroot,data);
    }
    else if(data < subroot.data){
        addLeft(subroot,newNode);
    }
}

private void addLeft(Node subroot, int data) {
    if(subroot.leftChild == null){
        subroot.leftChild = new Node(data);
    }
    else {
        add(subroot.leftChild,data);
    }
}

private void addRight(Node subroot, int data) {
    if(subroot.rightChild == null){
        subroot.rightChild = new Node(data);
    }
    else {
        add(subroot.rightChild,data);
    }
}

然后,add方法是:

public void add(int data){
    if(this.root == null){
        this.root = new Node(data);
    }
    else {
        this.add(this.root,data);
    }
}

我认为二叉树的一个不变量是根保持不变。顺便说一下,addRight也是如此。

最后你还写道:

newNode =this.root;

在您的add方法中,这当然没有多大意义。

 类似资料:
  • 给定二叉查找树(BST)和整数val的根。 在BST中找到该节点的值等于val的节点,并返回以该节点为根的子树。如果这样的节点不存在,则返回null。 为什么'ans=root'不起作用??

  • 本文向大家介绍在Javascript二进制搜索树中搜索值,包括了在Javascript二进制搜索树中搜索值的使用技巧和注意事项,需要的朋友参考一下 我们将使用BST的属性在其中查找元素。首先让我们看一下搜索的迭代实现-  示例 在此功能中,我们从根作为currNode开始,然后将我们的数据与currNode的数据进行比较。如果找到匹配项,则返回true,否则我们将继续根据数据与currNode数据

  • 问题内容: 我正在编写一个使用二进制搜索树存储数据的程序。在以前的程序中(无关),我能够使用Java SE6随附的实现来实现链表。二进制搜索树是否有类似的东西,还是我需要“从头开始”? 问题答案: 您可以使用。被实现为一棵红黑树,这是一个自平衡二进制搜索树。

  • 本文向大家介绍Javascript中的二进制搜索树类,包括了Javascript中的二进制搜索树类的使用技巧和注意事项,需要的朋友参考一下 这是BinarySearchTree类的完整实现- 示例

  • 我试着删除二叉查找树的节点,当我打印出来的时候,我得到的结果实际上不是这个删除,实际上可以删除二叉树本身的任何键。 我是二进制搜索树的新手。有人能帮我写代码吗?我们将感谢您的帮助。 谢谢 完整代码

  • 我正在尝试为二叉搜索树类编写一种方法来修改平衡的普通树,这使得树仅在一侧具有节点。 从元素在不平衡树中出现的顺序来看,依序遍历(左、中、右)之间似乎存在某种关系。