給定一棵二叉樹和兩個節點,找出這兩個節點最近的乙個公共父節點。
給出的兩個節點一定在樹中存在;
結點的值是隨機的,可能會重複,結點中只包含left和right兩個子結點,沒有指向父節點的parent。
此題可參考leetcode 236。
考慮兩個結點的存在情況:
乙個節點為是另外乙個節點的子或孫子節點,此時只要判斷root節點等於其中乙個節點即可;
兩個節點分屬兩支,此時兩個節點都是root節點的子或孫結點,同時在root.left和root.right中各能找到乙個節點;
如果不屬於以上兩種情況,對root.left和root.right遞迴判斷。
還有一種比較直接的方法,分別找出從root節點到兩個結點的路徑並儲存到乙個煉表裡,再對路徑比較得到最近公共父節點。
1、遞迴方法
/*class treenode
*} */
public treenode findancestor
(treenode root, treenode node1, treenode node2)
2、直接法
public treenode findancestor
(treenode root, treenode node1, treenode node2)
return res;
}private
boolean
getpath
(treenode root, treenode node, list
path)
if(root.right != null)
reture false
;}
二叉樹 最近公共父節點
給定二叉樹中的任意兩點,求解該兩點的最近公共父節點。程式大致分為遞迴和非遞迴兩種方式,下面我們先來認識非遞迴的方式。非遞迴程式總體的思路 用一種常見高效的資料結構來記錄下二叉樹中的結構關係,由於是找父節點,所以要用子節點來查詢父節點,我們這裡用到的是hashmap來進行樹形關係的儲存。接下來就是先列...
二叉樹的公共父節點
void findparent node root,node pt1,node pt2 1 對於二叉搜尋樹,裡邊的元素都是排好序的,那麼從根節點向下搜尋,找到第乙個節點p滿足p data pt1 data 且 p data pt2 data 假定pt1 data pt2 data 即是滿足要求的公共...
二叉樹近期公共父節點
在二叉樹中找近期公共父節點。分為兩種情況,一種是有父指標,一種沒有父指標。這樣的情況比較簡單。計算兩個結點的深度,再把深度大的向上移。移到同一深度。在同一時候向上移動,直到兩個結點同樣,這樣便找到了父節點。這個演算法時間複雜度為o n 實現 includestruct node int getdpe...