我刚刚遇到了这个用于查找二叉树大小的代码。
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)); 
  } 
} 
我很困惑为什么会有两种方法,一种没有参数。我可以猜测这是一些很好的做法,但无法想到原因。
我刚刚遇到了这个用于查找二叉树大小的代码。
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)); 
  } 
} 
我很困惑为什么会有两种方法,一种没有参数。我可以猜测这是一些很好的做法,但无法想到原因。
OOP 建议您应该在私有方法中编写业务逻辑。根据我的带有参数的视图大小方法是私有的,并且您计算大小的逻辑在这里,所以没有其他 on(类外)可以修改或访问您的逻辑(通过继承) .您正在使用另一种尺寸来返回具有公共修饰符的尺寸方法,其他用户将使用该类来获取尺寸,基本上其他用户不知道您是如何计算尺寸的。
一个是public,一个是private。所以一种是对外暴露使用,没有任何参数public int size(),另一种是对内使用,对外隐藏private int size(Node)。
这个概念称为封装,是隐藏不需要公开以供一般使用的内部细节的行为,以简化类(或库)的使用。
size采用 a的方法Node是递归实现的——它从树的Node下方找到树的大小。这在二叉树类本身之外没有用,所以它是private.
另size一种方法查找整个树的大小,调用者不必传入 a Node; 二叉树已经知道它的根是什么。它不是递归的。它委托给另一个size方法,传递root以获取整个树的大小。它在课堂之外非常有用,所以它是public.
还有一个参数是私有的,这意味着我只能使用类似的东西
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() 将用作默认根。