【问题标题】:Maximum Element in a Binary Tree (Error while trying root.getData())二叉树中的最大元素(尝试 root.getData() 时出错)
【发布时间】:2018-02-19 07:17:12
【问题描述】:

我使用模板创建了一个二叉树。我为所有节点输入了整数值,我想在二叉树中找到最大元素。

这里是实现:

public class BinaryTreeNode<T> {
    private T data;
    BinaryTreeNode right;
    BinaryTreeNode left;

    public BinaryTreeNode(T data) {
        this.data = data;
        this.right = null;
        this.left = null;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public BinaryTreeNode getRight() {
        return right;
    }

    public void setRight(BinaryTreeNode right) {
        this.right = right;
    }

    public BinaryTreeNode getLeft() {
        return left;
    }

    public void setLeft(BinaryTreeNode left) {
        this.left = left;
    }

    public int findMax(BinaryTreeNode root){
        int max= 0;
        if(root==null){
            return 0;
        } else {
            int left= findMax(root.left);
            int right= findMax(root.right);

            max= Math.max(left,right);
            if(max> root.getData()){
                max= root.getData();
            }
            return max;
        }
    }
}

我收到以下错误:

不兼容的类型:找到 java.lang.Object 所需的 int。

我在修改后的版本中写了这个:

int data= Integer.valueOf((String)root.getData());

有没有更好的方法?

【问题讨论】:

  • 我不知道您创建二叉树的规则是什么,但通常使用“二叉搜索树”,其中节点按某种标准排序。在每个节点上,较小的节点位于左子树中,较大的节点位于右侧。要找到最大值,您只需向右走,直到没有正确的孩子。
  • @Henry 这个问题没有说明二叉搜索树,所以我假设它是一个任意(未排序的)二叉树。
  • @Eran 是的,但是因为仅仅为了它而拥有一棵二叉树没有多大意义,我想知道这是否真的是有意的。

标签: java tree max binary-tree element


【解决方案1】:

root.getData() 有一个泛型类型T。这意味着您不能假设它将是Integer,您无法使用Math.max()findMax() 确定两个节点中的哪一个具有更高的值应该返回T,而不是int

为了找到最大元素,您必须要求T extends Comparable&lt;T&gt;,这将允许您使用compareTo() 比较两个BinaryTreeNodes 的数据,或者您应该将Comparator&lt;T&gt; 实例传递给树的构造函数,这将允许您使用 compare() 比较 BinaryTreeNodes 的数据。

您还必须避免使用原始类型BinaryTreeNode。在您的所有方法中将其替换为BinaryTreeNode&lt;T&gt;。否则,root.getData() 等方法调用将返回 Object 而不是 T

使用Comparable

public class BinaryTreeNode<T extends Comparable<T>>
{
    ...

    public T findMax(BinaryTreeNode<T> root) {
        T max = null;
        if(root == null) {
            return null;
        } else {
            T left = findMax(root.left);
            T right = findMax(root.right);

            max = left.compareTo(right) <= 0 ? right : left;
            if(max.compareTo(root.getData()) < 0) {
                max = root.getData();
            }
            return max;
        }
    }

    ...
}

【讨论】:

    猜你喜欢
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    相关资源
    最近更新 更多