国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

java - 一段遞歸代碼的問題

瀏覽:108日期:2024-01-08 16:29:44

問題描述

在一篇博客上看到了一個遞歸函數,但我感覺劃線的那一行似乎永遠不為true呢?

java - 一段遞歸代碼的問題

因為函數里的第一個判斷條件:

if (!root || p == root || q == root) return root;

就決定了left必定是p,q,null之一吧?

我對遞歸的理解不太深刻,不知道理解的對不對?謝謝。

問題解答

回答1:

首先你要弄明白,這個遞歸函數的返回值有4種可能:

null,表示這次遞歸已經碰到葉子節點,無法再繼續下去了。

p,表示這次遞歸已經碰到p節點了。

q,表示這次遞歸已經碰到q節點了。

lowestCommonAncestor,表示已經找到的最低公共祖先節點。

為何這樣說,前3種可能,你應該很好理解,因為從<1> if (!root || p == root || q == root) return root;這行代碼可以看出來。

那么再看(我就簡寫了)<2> left = lowestCommonAncestor(left, p, q);<3> right = lowestCommonAncestor(right, p, q);這兩行。在真正的lowestCommonAncestor被找到之前,這個函數只可能會返回null,q,p。再看這兩行判斷<4> if (left && left != p && left != q) return left;<5> if (right && right != p && right != q) return right;當<2>,<3>兩處的返回值是null,p,q的時候,這兩處判斷的條件都無法滿足,所以不會返回。所以要進入再下面的判斷<6> if (left && right) return root;這句什么意思?如果從<4>,<5>的判斷處沒有返回,說明left和right只能是null,p,q中的一個,而這里了又限定了left和right必須是非null,意思就是這時候left和right必定一個是p,一個是q。那么這個時候,本層遞歸函數的root(注意是本層遞歸函數)就是那個lowestCommonAncesstor,于是就返回它。最后一句<7> return left ? left : right;既然到了這里,就說明left和right里面至少有一個是null,那么就返回非null的那個,或者如果兩個都是null就返回null。

現在倒回去再看一下lowestCommonAncesstor這個遞歸函數在<2>,<3>兩處的調用,你可以把它看成是去當前節點的left和right中分別去尋找p,和q,那么無非結果有4種:

返回null,說明p,q根本不在這個分支中。

返回p,說明這個分支中只有p,沒有q。

返回q,說明這個分支中只有q,沒有p。

返回lowestCommonAncesstor,說明這個分支中既有p又有q,于是就已經找到他們的公共祖先啦!

可能說的還是不夠透徹,希望對你有幫助:)

回答2:

第一個條件是判斷root,第二個是判斷left,有什么聯系嗎?

標簽: java
相關文章:
主站蜘蛛池模板: 成人免费毛片一区二区三区 | 国内精品久久久久久影院8f | 91青草久久久久久清纯 | 亚洲高清色 | 久久99亚洲精品久久频 | 一本伊大人香蕉高清在线观看 | 精品毛片免费看 | 国产精品高清全国免费观看 | 欧美精品亚洲精品日韩一区 | 国产亚洲女在线精品 | 久久亚洲国产成人影院 | 九九视频免费精品视频免费 | 麻豆国产视频 | 亚洲午夜精品在线 | 国产丶欧美丶日韩丶不卡影视 | 欧美成人午夜影院 | 欧美另类交视频 | 亚洲第一se情网站 | 巨乳毛片 | 欧美日韩一区二区三区在线视频 | 在线观看视频亚洲 | 欧美一区精品二区三区 | 国产精品黄 | 中文字幕亚洲综合久久 | 国产午夜不卡在线观看视频666 | 国产手机看片 | 国产日本欧美亚洲精品视 | 国产 一二三四五六 | 毛片免费全部播放一级 | 久久91精品国产91久久 | 女人张开双腿让男人桶完整 | 99在线观看精品 | 热re66久久精品国产99热 | 国产成人一区二区三区在线播放 | 午夜剧场福利社 | 日本久久免费 | tubesexvideo日本护士 | 99热热久久这里只有精品166 | 欧美成人免费观看bbb | 人妖欧美一区二区三区四区 | 国产欧美一区视频在线观看 |