演算法描述
在二叉樹中求指定兩個節點的最小公共祖先
輸入: treenode* root, p, q;
輸出: lca
參考思路:
演算法思路
首先構建如下結構體儲存所需要的資訊
struct frame
在求解過程中,需要知道當前節點以及其父節點,並記錄可能的最小公共父節點。首先構建樹的後序遍歷序列ret,以frame結構為該序列的元素。構建過程中,若當前節點是p或者q,則result域置為當前節點,否則置空。因為result域存的是可能的最小公共節點,在初始化時我們認為p或者q所在節點為可能的最小公共節點的候選。
構建完ret之後,順序遍歷ret,對每個節點進行判斷,若當前節點的result域為空則跳過。否則,判斷其父節點result域是否為空。
若為空,則將父節點result域置為當前節點的result。若不為空,則表示父節點可能是兩個節點的公共節點,則將父節點的result域置為父節點。
這樣逐級傳遞,即可找到最小公共父節點。
**實現
/**
* definition for a binary tree node.
* struct treenode
* };
*/struct frame
};class solution
if(frame->node->left) s.push(new frame(frame->node->left, frame));
if(frame->node->right) s.push(new frame(frame->node->right, frame));
}// 尋找候選lca
for(int i=0;i1;i++) else }}
return ret.back()->result;
}};
tarjan lca最小公共祖先演算法
另一篇比較清楚的文章 原文 1,並查集 dfs 對整個樹進行深度優先遍歷,並在遍歷的過程中不斷地把一些目前可能查詢到的並且結果相同的節點用並查集合並.2,分類,使每個結點都落到某個類中,到時候只要執行集合查詢,就可以知道結點的lca了。對於乙個結點u.類別有 以u為根的子樹 除類一以外的以f u 為...
Leetcode 5109 最小公共區域
給你一些區域列表 regions 每個列表的第乙個區域都包含這個列表內所有其他區域。很自然地,如果區域 x 包含區域 y 那麼區域 x 比區域 y 大。給定兩個區域 region1 和 region2 找到同時包含這兩個區域的 最小 區域。如果區域列表中 r1 包含 r2 和 r3 那麼資料保證 r...
leetcode首個公共祖先
設計並實現乙個演算法,找出二叉樹中某兩個節點的第乙個共同祖先。不得將其他的節點儲存在另外的資料結構中。注意 這不一定是二叉搜尋樹。例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,null,7,4 3 5 1 6 2 0 8 7 4 示例 1 輸入 root 3,5,1,6,2,...