8

我刚刚遇到了这个用于查找二叉树大小的代码。

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)); 
  } 
} 

我很困惑为什么会有两种方法,一种没有参数。我可以猜测这是一些很好的做法,但无法想到原因。

4

4 回答 4

4

OOP 建议您应该在私有方法中编写业务逻辑。根据我的带有参数的视图大小方法是私有的,并且您计算大小的逻辑在这里,所以没有其他 on(类外)可以修改或访问您的逻辑(通过继承) .您正在使用另一种尺寸来返回具有公共修饰符的尺寸方法,其他用户将使用该类来获取尺寸,基本上其他用户不知道您是如何计算尺寸的。

于 2013-10-03T18:39:04.087 回答
4

一个是public,一个是private。所以一种是对外暴露使用,没有任何参数public int size(),另一种是对内使用,对外隐藏private int size(Node)

这个概念称为封装,是隐藏不需要公开以供一般使用的内部细节的行为,以简化类(或库)的使用。

于 2013-10-03T18:33:04.080 回答
3

size采用 a的方法Node是递归实现的——它从树的Node下方找到树的大小。这在二叉树类本身之外没有用,所以它是private.

size一种方法查找整个树的大小,调用者不必传入 a Node; 二叉树已经知道它的根是什么。它不是递归的。它委托给另一个size方法,传递root以获取整个树的大小。它在课堂之外非常有用,所以它是public.

于 2013-10-03T18:32:37.830 回答
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

现在,为什么要使用具有相同名称和不同参数的方法

做或不做的理由可能很少。通常这意味着有不止一种方法可以做某事,或者您想使用其他东西作为默认值,在这种情况下, size() 将用作默认根。

于 2013-10-03T18:41:53.843 回答