2012-02-15 23 views
0

下面的代碼塊究竟如何工作?更具體地說,程序如何知道返回哪個選項?世界上的這種代碼如何阻止工作[樹]?

return ancestor (node1->left(), node2) 
      || ancestor (node1->right(), node2) 
      || ancestor (node2->left(), node1) 
      || ancestor (node2->left(), node1); 

該代碼塊是代碼部分來遍歷樹,以便確定是否一個節點處於樹給定的節點1和節點2時的另一個的祖先。

注意,節點1和節點中傳遞給負責確定是否存在可能的祖先/後代關係的函數:

bool ancestor (const Binary_node<Type> * node1, const Binary_node<Type> * node2) 
{ 
     // .... code 
} 
+1

這是多麼可愛的遞歸。 – LihO 2012-02-15 20:13:51

回答

2

程序如何知道返回哪個選項?

該程序將不斷嘗試的選項,直到它找到一個工程。

下面的代碼塊是如何工作的?

在每次調用祖先(),該函數將嘗試四種可能性:

  • 移動節點1到它的左子樹,並嘗試通過對問題的其餘剩下的工作。
  • 如果這樣做不起作用,請嘗試將node1移至其右側子樹。
  • 如果這樣做不起作用,請將node2移到其左側子樹中。
  • 如果這樣做不起作用,請將node2移至其右側子樹。

如果所有四種可能性都失敗了,那麼節點node1和node2確實通過祖先關係不相關。

警告:如實施,祖先函數是非常緩慢的,除了非常小的樹木。因爲我們在每個祖先()調用中嘗試四個選項,所以如果您將樹的高度增加1,則狀態數大約增加四倍。

2

如果調用一個ancestor返回true,它會返回真(沒有評估其他通話)。

+0

但是這是負責遍歷樹搜索如果node1是node2的祖先或反之亦然的代碼...它是如何通過上述實現來做到這一點... 0_o – rrazd 2012-02-15 20:14:55

+0

可能有一些其他地方,其中使用的函數返回布爾值價值,不在嗎? – Griwes 2012-02-15 21:08:42

2

的術語從左向右計算和第一個即true終止評價(在快捷布爾評估),並返回true。否則結果是false

1

它從左到右評估,所以首先測試ancestor (node1->left(), node2)。接下來,它查看按位運算符||,它基本上表示「如果先前的操作是錯誤的,則嘗試下一個操作」。

1

我想你的函數返回一個布爾值。如果其中一個祖先是真的,它將會返回true。如果您使用兩個布爾值,結果如下:

 
A  B  (A || B) 
false false false 
true false true 
false true  true 
true true  true 

如果使用的多個布爾值(或者值,可以解釋爲布爾值),比A||B||C..等於((A||B)||C)||...

1

它返回一個布爾值。因此,您所指的區塊僅使用short circuiting來返回它找到的第一個true值,或者如果它們全都評估,則返回false

1

如果語句有幾個由||連接的子句。或& &然後評估是從左到右,第一次短路。在這種情況下||正在使用該函數將從左到右(或從代碼佈局中的頂部到底部)工作,並且第一次評估爲true時,它將返回true,從而避免評估其他選項。

1

請注意,祖先只返回true/false。此代碼使用早期的邏輯表達式評估。在'或'(||)語句中。如果第一次調用不返回true,則調用下一個,直到其中一個返回true。如果沒有一個返回true,則返回false。

在這段代碼中:如果我發現node1-> left()是node2的祖先,我不必評估其餘的語句,因爲我已經知道答案。