1
樹樣本:查找id元素在樹數據結構
root
/| \
1 2 4
/ /|\
3 5 6 7
/\
13 14
我有一個功能,在樹中搜索元素遞歸。例如我想找到元素#6
我寫了一些評論,請幫助我,我做錯了什麼?
樹樣本:查找id元素在樹數據結構
root
/| \
1 2 4
/ /|\
3 5 6 7
/\
13 14
我有一個功能,在樹中搜索元素遞歸。例如我想找到元素#6
我寫了一些評論,請幫助我,我做錯了什麼?
事實確實在中間:當您不返回遞歸調用的值時,您將丟失收集的信息。另一方面,當您返回遞歸調用的值時,它將不起作用,因爲您將在foreach
循環的第一次迭代中返回總是。
所以,你需要有時候返回它:只有當你在遞歸部分有一個匹配時。如果沒有成功,則不應返回並繼續foreach
循環:
public function getChildById($root, $id){
if (!empty($root->nodes)){
foreach ($root->nodes as $node){
if ($node->getId()==$id){
return $node;
} else {
$found = $this->getChildById($node, $id);
if ($found) return $found;
}
}
}
}
看到它在eval.in運行。
請注意,在根目錄上進行匹配測試比較常見,所以在函數的開始處。它涉及到同樣的事情,除了如果該值是你調用該函數的根,它也被發現!
public function getChildById($root, $id){
if ($root->getId()==$id) return $root;
foreach ($root->nodes as $node){
$found = $this->getChildById($node, $id);
if ($found) return $found;
}
}
非常感謝! 現在我明白了 – SergioZhidkov
你沒有捕獲你的遞歸調用的返回值。並且沒有辦法指示失敗的搜索(例如,當你到達節點13時,你必須返回SOMETHING來表示在該分支中沒有發現任何東西(並且什麼都不能找到),所以「父」呼叫將知道繼續前進到下一個兄弟節點 –