Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 二叉树的大小法_Java_Oop_Binary Tree - Fatal编程技术网

Java 二叉树的大小法

Java 二叉树的大小法,java,oop,binary-tree,Java,Oop,Binary Tree,我刚刚遇到了一个查找二叉树大小的代码 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)); } } 我很困惑,为什么有两种方法,一种没有争议。我可以猜到这是一种很好的做法,但我想不出原因 采用节点的si

我刚刚遇到了一个查找二叉树大小的代码

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

我很困惑,为什么有两种方法,一种没有争议。我可以猜到这是一种很好的做法,但我想不出原因

采用
节点
size
方法是递归实现的——它从该
节点
向下查找树的大小。这在二叉树类之外没有用处,因此它是私有的


另一个
size
方法查找整个树的大小,调用方不必传入
节点
;二叉树已经知道它的根是什么。它不是递归的。它委托给另一个
size
方法,传递
root
以获得整个树的大小。它在课堂之外非常有用,因此它是
公共的

一个是
公共的
,一个是
私人的
。因此,一个在外部公开和使用,没有任何参数
public int size()
,另一个只在内部使用,在外部隐藏
private int size(Node)


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

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

而且带有参数的是private,这意味着我只能使用

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()将用作默认根