求 二叉樹中兩個結(jié)點(diǎn)的最近的公共祖先剿涮。
后序遍歷遞歸
先找左子樹是否能找到p或者q言津,找到返回左子樹;
再找右子樹是否能找到p或者q取试,找到返回右子樹悬槽;
如果左右子樹都不為空,則一邊一個瞬浓,返回root初婆;
如果一邊為空,一邊為非空猿棉,返回非空的磅叛;
終止條件:
root==p || root==q || root==nullptr;
非遞歸
先找到其中一個結(jié)點(diǎn),然后停止铺根,在該節(jié)點(diǎn)的孩子中找另外的宪躯,找不到的話就返回到其父親,循環(huán)位迂。保持一個父親棧访雪。
偽代碼:
father stack fs;
cur = root;
while 堆棧不空 或 cur不空:
比較value掂林,找到其中一個結(jié)點(diǎn)臣缀,跳出循環(huán)。
cur入fs泻帮。
if curleft 存在 cur = cur->left;
else if curright存在精置,cur入fs,cur = cur->right
else if 是葉子:
彈出fs锣杂,
if cur是fs左孩子:令cur入棧糜俗,cur = fs右孩子
else if cur是fs右孩子:fs再彈出一個渔扎,回到彈出fs
while fs不空
從cur的子樹中尋找另外一結(jié)點(diǎn),找到跳出
從fs中彈出父親,
關(guān)鍵點(diǎn)
查找元素庆聘;返回值的巧妙運(yùn)用昼激,賦予其不同的涵義汁汗;