如何为BinaryTree类编写left()和right()方法?
如何为BinaryTree类编写left()和right()方法?
我正在修读一门数据结构与算法课程。上节课,我的教授在黑板上放了一些代码,解释了如何编写size()
、height()
以及left()
/right()
方法,为我们准备了一次关于二叉树平衡的测验。\n他在黑板上写下了下面的代码,但是他提到虽然他犯了一个错误,现在我们要关注逻辑,他会运行一些测试来理解他的错误。\n
public class BT{ TreeNode root; BT 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 left() { return root.left; } public BT right() { return root.right; } }
\n在周末,由于教授办公室被大量学生拜访以准备期中考试,我尝试自己解决这个问题。\n如何修复这个方法呢?\n编辑:\n这是TreeNode
类:\n
class TreeNode{ T data; TreeNode left; TreeNode right; }
\n它是在同一个包中的另一个类中定义的。
问题的出现原因是left()和right()方法应该属于内部的TreeNode类,而不是公开的方法。解决方法是将这两个方法移动到TreeNode类中去。
class TreeNode{ T data; TreeNode left; TreeNode right; TreeNode left() { return left; } TreeNode 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方法更多是一种风格上的考虑。
问题的原因是在一个BinaryTree
如果TreeNode类被定义在A类内部,那么创建TreeNode对象的方式应该是:
A.TreeNode node = new A.TreeNode()
如果我对内部类的理解有误,请告诉我,我会相应地修改或删除我的回答。
链接中的stackoverflow页面解释了访问内部类的问题以及解决方法。
不完全正确,更像是这样的:
class TreeNode{ T data; TreeNode left; TreeNode right; } public class Traverse { // 代码主体 }