2013-10-03 38 views
7

我剛剛遇到了這個代碼,用於查找二叉樹的大小。二叉樹的大小方法

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

OOP建議您應該在私有方法中編寫您的業務邏輯。按照我的視圖大小方法使用參數是私有的,並且您計算大小的邏輯在這裏,所以沒有其他人可以修改或訪問您的邏輯(通過繼承)。您正在使用另一個大小來返回具有公共修飾符的此大小的方法,而其他用戶將使用該類來獲取大小,其他用戶不知道如何計算大小。

3

size方法,它接受Node遞歸執行 - 它發現樹的大小從Node下來。這在二叉樹類本身之外沒有用,所以它是private

其他size方法找到整個樹的大小,並且呼叫者不應該通過Node;二叉樹已經知道它的根。它不是遞歸的。它委託給另一個size方法,傳遞root以獲取整個樹的大小。這是非常有用的,所以它是public

4

一個是public,一個是private。所以一個暴露在外,沒有任何參數public int size(),另一個只在內部使用,外部隱藏private int size(Node)

這個概念被稱爲封裝並隱藏不需要在努力簡化類(或庫)的使用被暴露於一般消費內部細節的行爲。

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

從理論上講,在二叉樹中有子項的所有分支也可以作爲二叉樹處理。

Binary Tree sample

注意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()將用作默認的根。