在這裡介紹兩種方法:中序法、後序法
1.後序法:主要利用的是後序遍歷的時候,棧裡面存放的是此時的這個結點的所有的父親結點,所以這個時候只要將兩個結點的父親序列都取出來,然後進行對齊,之後兩個指標同時移動,當指標所指向的內容相等的時候就找到了那個最小的公共父親結點
treenode
*lowestcommonancestor
(treenode
* p, treenode
* q)
while
(!st.
empty()
&& tag.
top())
else
} st.
pop();
tag.
pop();
cur =
nullptr;}
if(!st.
empty()
)}if(res1.
size()
< res2.
size()
)int i = res1.
size()
- res2.
size()
;for
(; i >
0; i--
)while
(res1.
top(
)!= res2.
top())
return res1.
top();
}
2.中序法:通過中序遍歷來尋找最小的公共父親結點的思路如下:首先和中序一樣,將每個結點及其左節點入棧,然後開始出棧列印的時候判斷一下是否是我們要找的結點,如果是的話,就也出棧,然後看自己是不是結點,是的話就直接列印本節點,不是的話就進入它的右邊開始找,這個時候右邊如果找到的時候就返回此時的tmp,tmp會跟隨結點變化
treenode
*lowestcommonancestori
(treenode
* p, treenode
* q)if(
!st.
empty()
)if(cur == p || cur == q)
else
} st.
pop();
cur = cur-
>m_right;}}
return
nullptr
;}
完全二叉樹兩個結點的公共結點
1 2 3 4 5 6 7 如上圖所示,由正整數 1,2,3,組成了一棵無限大的二叉樹。從某乙個結點到根結點 編號是1的結點 都有一條唯一的路徑,比如從5到根結點的路徑是 5,2,1 從4到根結點的路徑是 4,2,1 從根結點1到根結點的路徑上只包含乙個結點1,因此路徑就是 1 對於兩個結點x和y,...
求二叉樹中任意兩個結點的距離
實現步驟 計算跟到第乙個結點的距離 計算跟到第二個結點的距離 計算lca 計算跟到lca結點的距離 結果為 1 2 2 4 因為重複計算了兩次的從跟到lca結點的距離 class node object def init self value 0 self value value self left...
二叉樹找到兩個結點的最近公共祖先
面試題68 i.二叉搜尋樹的最近公共祖先 這是乙個二叉搜尋樹,根節點左邊的數都小於根節點,根節點右邊的數都大於根節點。如果兩個結點的值都小於根節點的值,兩個結點一定都在樹的左邊。都大於根節點的值,那麼兩個結點一定都在樹的右邊。如果乙個大於根節點,乙個小於根節點,那麼根節點一定是最近的公共祖先。總結一...