【问题标题】:How do I write the left() and right() methods for a BinaryTree<T> class如何为 BinaryTree<T> 类编写 left() 和 right() 方法
【发布时间】:2020-03-07 06:19:32
【问题描述】:

我目前正在学习数据结构和算法课程。上一节课,我的教授在黑板上放了一些代码来解释如何编写size()height()left()/right() 方法来教我们两个平衡以备测验。

他在黑板上写了你在下面看到的代码,但他提到虽然他犯了一个错误,但现在要专注于逻辑,他必须运行一些测试才能理解他的错误。

public class BT<T> {
    TreeNode<T> root;
    BT<T> myTree;

    //size
    public int size() {
        if(this.isEmpty())
            return 0;
        return (1 + this.left().size() + this.right().size());
    }
    //isEmpty()
    public boolean isEmpty() {
        return (root == null);
    }
    //left
    public BT<T> left() {
        return root.left;
    } 

    public BT<T> right() {
        return root.right;
    }
}

周末,我试图自己解决这个问题,因为在我教授的办公时间,由于有大量学生在期中访问他,他无法编写代码。

有什么办法可以解决这个问题?

编辑:

这是TreeNode&lt;T&gt;

class TreeNode<T> {
    T data;
    TreeNode<T> left;
    TreeNode<T> right;

}

它在同一个包的另一个类中。

【问题讨论】:

  • "有什么办法可以修复这个方法?" 哪个方法?如果您要询问left()right() 方法,我们不能不看TreeNode 的定义。
  • 刚刚使用 TreeNode 类进行了编辑。

标签: java data-structures syntax-error binary-tree


【解决方案1】:

由于left和right不一定要暴露,而是属于内部(非公共)TreeNode的方法移到那里。

  return root == null ? 0 : root.size();

class TreeNode<T> {
    T data;
    TreeNode<T> left;
    TreeNode<T> right;

    TreeNode<T> left() {
        return left;
    } 

    TreeNode<T> right() {
        return right;
    }

    int size() {
        int n = 1;
        if (left != null) {
            n += left.size();
        } else if (right != null) {
            n += right.size();
        }
        return n;
    }
}

子树没有公开的概念,容器类BT持有大小和根节点。

因此,拥有诸如left()right() 之类的getter 更像是一种风格问题。

【讨论】:

    【解决方案2】:

    如果如您所说,TreeNode 类位于另一个类(内部类)中,则如果没有外部类的实例,您将无法访问内部类。

    因此,如果您的 TreeNode 类是在 A 类中定义的,您需要一起创建它们:

    A.TreeNode node = new A.TreeNode()
    

    而不是只在 BT 类中创建 TreeNode。

    您可以查看explain the way to access inner class in java?,我认为它解释了问题以及解决方案。

    如果我对内部类的假设是错误的,请告诉我,我将修改或删除我的答案。

    【讨论】:

    • 不完全是,更像class TreeNode&lt;T&gt; { T data; TreeNode&lt;T&gt; left; TreeNode&lt;T&gt; right; } public class Traverse &lt;T&gt;{ //code body }
    猜你喜欢
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多