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

如何正确使用二叉查找树的通用实现[重复]

慕阳文
2023-03-14

我写了一个二叉查找树

二进制节点:

public class BinaryNode<T extends Comparable<T>> {
T data;
BinaryNode<T> left;
BinaryNode<T> right;


public BinaryNode (T data){
    this.data = data;
}
public BinaryNode (){
    this(null);
}

//insert

public void insert(T data){
    // if data is less than node's data , then if left is null insert , if not do the same for left
    if(this.data.compareTo(data) > 0){
        if(this.left == null){
            left =  new BinaryNode<>(data);
        }
        else {
            left.insert(data);
        }
    }
    // if data is greater than node's data , then if right is null insert , if not do the same for right
    else if(this.data.compareTo(data) < 0) {
        if (this.right == null) {
            right =  new BinaryNode<>(data);;
        }
        else{
            right.insert(data);
        }
    }
    // if it's equal to node's data do nothing as we do not allow duplicate values.
}

public void traverseInOrder(){
    if(this.left != null){
        left.traverseInOrder();
    }
    System.out.println(this.data);
    if(this.right != null){
        right.traverseInOrder();
    }
}

public BinaryNode getMin(){
    if(left !=null) {
       return left.getMin();
    }
    return this;
}
public BinaryNode getMax(){
    if(right !=null){
       return right.getMax();
    }
    return this;
}
public BinaryNode get(T data){

    if(this.data.compareTo(data) > 0){
        if(this.left == null) {
            return null;
        }
        return left.get(data);
    }
    if(this.data.compareTo(data) < 0){
        if(this.right == null){
            return null;
        }
        return right.get(data);
    }
    return this;
}

@Override
public String toString() {
    return "data = " + data ;
}
}

二叉树:

public class BinaryTree<T extends Comparable<T>> {
BinaryNode<T> root;

public BinaryTree(T data){
    root = new BinaryNode<T>(data);
}
public BinaryTree(){
    root = null;
}

public void insert(T data){
    if(root == null){
        root = new BinaryNode<T>(data);
    }
    else{
        root.insert(data);
    }
}

public void traverseInOrder(){
    if(root == null){
        return;
    }
    root.traverseInOrder();
}

public BinaryNode getMin(){
    if(root == null){
        return null;
    }
    return root.getMin();
}

public BinaryNode getMax(){
    if(root == null){
        return null;
    }
    return root.getMax();
}

public BinaryNode get(T data){
    if(root == null){
        return null;
    }
    return root.get(data);

}


}

姓名:

public class Name implements Comparable {
String name;


public Name(String name){
    this.name = name;
}
public Name(){
    this("");
}


@Override
public int compareTo(Object o) {
    if(!(o instanceof Name)) throw new IllegalArgumentException();
    String n1 = this.name.toLowerCase();
    String n2 = ((Name) o).name.toLowerCase();
    for(int i = 0; i< n1.length() && i< n2.length() ; i++ ){
        if(n1.charAt(i) > n2.charAt(i)) return 1;
        if(n2.charAt(i) > n1.charAt(i)) return -1;
    }
    if(n1.length() > n2.length()) return -1;
    if(n2.length() > n1.length()) return 1;

    return 0;
}
public String toString(){
    return name;
}
}

现在我可以很容易地在Main中创建一个二叉树,如下所示:

BinaryTree<String> nametree = new BinaryTree<>();

但如果我想做一些事情,比如:

BinaryTree<Name> nametree = new BinaryTree<>();

然后我会得到一个编译错误,除非我在BinaryNode和BinaryTree类中更改Comparable to Comparable,我觉得我对泛型没有很好的理解,所以如果有人能澄清我所做的是什么错误的话。还有任何能帮助我更好、正确使用泛型的东西,那就太好了。提前谢谢!

共有1个答案

郎睿
2023-03-14

问题可能是,当您以名称实现可比较接口时,它需要一个类型。

尝试将Name的类定义设置为:public class Name

这个答案给出了一个很好的解释:Java的含义

 类似资料:
  • 考虑一下Robert Sedgewick在他的网站上的声明: 我非常困惑,当键大于根时会发生什么,尤其是当他说:“但只有当右子树中有一个键小于或等于键时”。我想他的意思是,如果键小于根,那么键肯定在左子树中。另一方面,如果密钥更大,则密钥“可能”在正确的子树中,因此也可能在正确的子树上找不到密钥。根据他的floor()方法: 他确实检查了右子树,但没有检查左子树。但我完全不能想出一个例子,其中键大

  • 主要内容:什么是二叉排序树?,使用二叉排序树查找关键字,二叉排序树中插入关键字,二叉排序树中删除关键字,总结前几节介绍的都是有关静态 查找表的相关知识,从本节开始介绍另外一种查找表—— 动态查找表。 动态查找表中做查找操作时,若查找成功可以对其进行删除;如果查找失败,即表中无该关键字,可以将该关键字插入到表中。 动态查找表的表示方式有多种,本节介绍一种使用树结构表示动态查找表的实现方法—— 二叉排序树(又称为 “二叉查找树”)。 什么是二叉排序树? 二叉排序树要么是空 二叉树,要么具有如下特点:

  • 我正在努力实现二叉搜索树。完成实现所需的功能之一是重新平衡功能。 根据规范,该功能的工作方式如下: rebalance() 方法应创建一个平衡树,从而将偏度降低为零。平衡树是指在整个树中,左子树和右子树的大小相差不超过1(即,每个子树也是平衡的)。 为了平衡树,rebalance() 方法应反复将根值移动到较小的子树,并将最小/最大值从较大的子树移动到根,直到树平衡。然后,它应该以递归方式平衡两个

  • 本文向大家介绍python实现二叉查找树实例代码,包括了python实现二叉查找树实例代码的使用技巧和注意事项,需要的朋友参考一下 本文研究的主要是python实现二叉查找树的相关内容,具体介绍及实现如下。 1. 二叉查找树的定义: 左子树不为空的时候,左子树的结点值小于根节点,右子树不为空时,右子树的结点值大于根节点,左右子树分别为二叉查找树 2. 二叉查找树的最左边的结点即为最小值,要查找最小

  • 我们已经看到了两种不同的方法来获取集合中的键值对。回想一下,这些集合实现了 map 抽象数据类型。我们讨论的 map ADT 的两个实现是在列表和哈希表上的二分搜索。在本节中,我们将研究二叉查找树作为从键映射到值的另一种方法。 在这种情况下,我们对树中项的确切位置不感兴趣,但我们有兴趣使用二叉树结构来提供高效的搜索。

  • 本文向大家介绍Ruby实现的最优二叉查找树算法,包括了Ruby实现的最优二叉查找树算法的使用技巧和注意事项,需要的朋友参考一下 算法导论上的伪码改写而成,加上导论的课后练习第一题的解的构造函数。