我刚刚遇到这个代码,用于查找二叉树的大小。
public int size() {
return(size(root));
}
private int size(Node node) {
if (node == null) return(0);
else {
return(size(node.left) + 1 + size(node.right));
}
}
我很困惑为什么它有两个方法,一个没有参数。我可以猜测这是一个很好的做法,但无法想到原因。
答案 0 :(得分:4)
一个是public
,一个是private
。因此,在没有任何参数public int size()
的情况下公开并使用其中一个,而另一个仅在内部使用并在外部隐藏private int size(Node)
。
这个概念被称为封装,是为了简化类(或库)的使用而隐藏不需要为了一般消费而暴露的内部细节的行为。
答案 1 :(得分:4)
OOP建议您应该在私有方法中编写业务逻辑。根据我的视图,使用参数的大小方法是私有的,并且您计算大小的逻辑在这里,因此没有其他(类外)可以修改或访问您的逻辑(你正在使用另一个大小来返回这个带有公共修饰符的大小方法,其他用户将使用该类来获取大小基本上其他用户不知道你是如何计算大小的。
答案 2 :(得分:3)
采用size
的{{1}}方法以递归方式实现 - 它从Node
向下查找树的大小。这在二叉树类本身之外没有用,所以它是Node
。
另一个private
方法查找整个树的大小,并且调用者不必传入size
;二叉树已经知道它的根是什么。这不是递归的。它委托给另一个Node
方法,传递size
以获得整个树的大小。它在课外非常有用,所以它是root
。
答案 3 :(得分:1)
而且带有参数的那个是私有的,这意味着我只能使用像
这样的东西MyBinaryTree bt = new MyBinaryTree();
int treeSize = bt.size();
通常,代码可以通过注释来了解它们的用途。有时,干净的代码甚至不需要评论。
/**
* Gets the size of the current binary tree.
*/
public int size() {
return(size(root));
}
/**
* Gets the size of the given branch
* @param node The branch to count from.
*/
private int size(Node node) {
if (node == null) return(0);
else {
return(size(node.left) + 1 + size(node.right));
}
}
理论上,二叉树中所有带子节点的分支也可以作为二叉树处理。
请注意size()
将使用根节点作为参数调用第二个,在这种情况下,它表示从A开始计数,内部将是。
Size of the tree is count of items from A
Items from A are 1 + Items from B + Items from C
Items from B are 1
Items from C are 1 + Items from D + items from E
现在,您为什么要使用method with the same name and diferent arguments?
可能没有理由这么做或不这样做。通常,这意味着有多种方法可以执行某些操作或者您希望将其他内容用作默认值,在这种情况下,size()将用作默认根。