九章演算法面試題56 最近公共祖先
九章演算法官網-原文網址
題目
給出一棵二叉樹和兩個二叉樹上的節點,求出這兩個點的最近公共祖先(Lowest Common Ancestor, LCA)。
如下面這棵二叉樹:
1
/ \
2 3
/ \
4 5
4和5的最近公共祖先是3,2和4的最近公共祖先是1,1和3的最近公共祖先是1(假設自己是自己的祖先)
Follow Up Question 1: 如果樹中的每個節點儲存了自己的parent節點,演算法應該是什麼樣的?
Follow Up Question 2: 如果樹中的每個節點沒有儲存自己的parent節點,但給你這棵二叉樹的根節點,演算法應該是什麼樣的?
解答
對於有parent節點的二叉樹,方法很簡單,就是分別從兩個節點網上列出到根的所有點,再反向查詢第一個分叉的位置。
對於沒有parent節點的二叉樹,必須給出root。然後從root開始用分治演算法往兩邊查詢兩個節點。如果有LCA就返回LCA,如果碰到其中一個點就返回其中一個點。
參考程式
相關推薦
九章演算法面試題56 最近公共祖先
九章演算法官網-原文網址 題目 給出一棵二叉樹和兩個二叉樹上的節點,求出這兩個點的最近公共祖先(Lowest Common Ancestor, LCA)。 如下面這棵二叉樹: 1 / \ 2 3
九章演算法面試題77 插入區間
原網址: 問題詳情 給出一個無重疊的按照區間起始端點排序的區間列表。 在列表中插入一個新的區間,你要確保列表中的區間仍然有序且不重疊(如果有必要的話,可以合併區間)。線上評測本題: http://www.lintcode.com/zh-cn/problem/insert
九章演算法面試題1 落單的數
九章演算法官網-原文網址: 題目 初階:有2n+1個數,其中2n個數兩兩成對,1個數落單,找出這個數。要求O(n)的時間複雜度,O(1)的空間複雜度。 進階:如果有2n+2個數,其中有2個數落單,該怎麼辦? 線上測試本題 解答 初階:將2n+1個數異或起來,相同的數會
九章演算法面試題61 克隆圖
九章演算法官網-原文網址 題目 給出一個圖,並且給出圖的起始節點,知道這個圖的節點的定義,要求克隆這個圖,返回克隆圖的起始節點。 線上測試本題 解答 這一類克隆一個圖的題目,我們都可以分為兩步。 第一步: 克隆點。 只需要用廣度優先搜尋的方法從根節點出發去遍歷一遍圖,
九章演算法——面試題思路
面試題1 落單的數 題目描述: 有2n+1個數,其中2n個數兩兩成對,1個數落單,找出這個數。要求O(n)的時間複雜度,O(1)的空間複雜度。進階問題:如果有2n+2個數,其中有2個數落單,該怎麼辦? 答: 初階:將2n+1個數異或起來,相同的數會抵消,異或的答
九章演算法面試題80 接雨水
原文網址: 問題詳情 給出 n 個非負整數,代表一張X軸上每個區域寬度為 1 的海拔圖, 計算這個海拔圖最多能接住多少(面積)雨水線上評測本題: http://www.lintcode.com/zh-cn/problem/trapping-rain-water/解答
九章演算法面試題32 小球排序
九章演算法官網-原文網址 題目 有紅黃藍三色的小球若干排成一列,這些小球進行排序,請使用盡量少的空間和時間。解答 假設順序為紅色黃色藍色。用兩根指標從頭開始遍歷,第一根指標遇到非紅色時停下,如果第二根指標找到第一根指標之後的第一個紅色停下,交換兩根指標所指顏色。重複上述過
九章演算法面試題38 洗牌的技巧
九章演算法官網-原文網址 題目 有一副撲克有2n張牌,用1,2,..2*n代表每一張牌,一次洗牌會把牌分成兩堆,1,2..n和n+1...2n。然後再交叉的洗在一起:n+1, 1, n+2, 2, … n, 2n。問按照這種技巧洗牌,洗多少次能夠洗回撲克最初的狀態:1,2
九章演算法面試題66 2 sum
九章演算法官網-原文網址 題目 給一堆陣列和一個目標值,在這堆數組裡面找出兩個數使得他們的和等於目標值。 線上測試本題 http://www.lintcode.com/en/problem/2-sum/ 解答 如果原題的陣列中第i個元素我們用ai來表示,目標值我們用v來
九章演算法面試題45 尋找最大的儲水容器
九章演算法官網-原文網址 題目 給定一個正整數陣列(a0,a1..),分別代表n個座標(0,a0), (1,a1),根據這n個點畫出n條線段,每條線段的兩個端點分別為(i, ai)和(i, 0)。找到兩條線段,使得這兩條線段和x軸所構成的容器儲水容量最大。如[2,1,3]
九章演算法面試題87 最小子陣列
原文網址 問題詳情 給定一個整數陣列,找到一個具有最小和的子陣列。返回其最小和。線上評測本題: http://www.lintcode.com/zh-cn/problem/minimum-subarray/解答 這道題和max subarray很類似,我用local
九章演算法面試題79 尋找峰值
原文網址: 問題詳情 你給出一個整數陣列(size為n),其具有以下特點: 相鄰位置的數字是不同的 A[0] < A[1] 並且 A[n - 2] > A[n - 1] 假定P是峰值的位置則滿足A[P] > A[P-1]且A[P] > A[P
Tarjan演算法求LCA(最近公共祖先)
LCA的離線演算法。複雜度為O(n+q)。 這個演算法充分利用了dfs樹的結構。 對於每個節點u,關於它的詢問(u,v)只有兩種。(假設先dfs(u)後dfs(v)) 1、v在u的子樹內。 此時LCA(u,v) = u. 2、v不在u的子樹內。 ⑴假設v在u的父親的另一棵子
演算法詳解之最近公共祖先(LCA)
若圖片出鍋請轉至here 概念 首先是最近公共祖先的概念(什麼是最近公共祖先?): 在一棵沒有環的樹上,每個節點肯定有其父親節點和祖先節點,而最近公共祖先,就是兩個節點在這棵樹上深度最大的公共的祖先節點。 換句話說,就是兩個點在這棵樹上距離最近的公共祖先節點。 所以LCA主要是用來處理當兩個點僅有唯一一條確定
九章演算法 | Facebook 面試題 : Backpack VI 揹包演算法
2017-12-21 題目描述 給一個nums[]陣列,如[1, 2, 4] 將這些數組合使得: 這些數的和是給出的一個target,如使這些數的和等於4,求這樣的組合有多少個? 樣例 樣例
lintcode&九章演算法——Microsoft 面試題 | 我能贏 ? 待解決
題目描述 有兩個人玩一個遊戲,給定一個最大可取整數 maxChoosableInteger,兩個人輪流從1~maxChoosableInteger 中取一個數,取過的數不可再取,若其中一方取過以後, 所有取過的數加起來的和大於等於desiredTotal,那
前端常見演算法面試題之 - 從尾到頭列印連結串列[JavaScript解法]
前端常見演算法面試題之 - 從尾到頭列印連結串列[JavaScript解法] 題目描述 實現思路 程式碼實現 題目描述 輸入一個連結串列的頭結點,從尾到頭反過來打印出每個結點的值 實現思路 前端工程師看到這個題目,直接想到的就是
前端常見演算法面試題之 - 二維陣列中的查詢[JavaScript解法]
前端常見演算法面試題之 - 二維陣列中的查詢[JavaScript解法] 題目描述 輸入輸出分析 實現思路 程式碼實現 題目描述 在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個
九章演算法筆記 5.深度優先搜尋 Depth First Search
DFS cs3k.com 什麼時候用dfs? 短, 小, 最問題 而90%DFS的題, 要麼是排列, 要麼是組合 組合搜尋問題 Combination 問題模型:求出所有滿足條件的“組合” 判斷條件:組合中的元素是順序無關的 時間複雜度:與 2^n 相關 遞迴三要素 一般來說,如果面試官不特
九章演算法筆記 4.寬度優先搜尋 Breadth First Search
演算法與題型 cs3k.com DFS: 用於搜尋, 題目中有ALL字樣 二分法: 用於時間複雜度小於O(n)的情況 分治法: 二叉樹問題, 子問題和父問題有關係 BFS:- 二叉樹上的寬搜- 圖上的寬搜: 拓撲排序- 棋盤上的寬搜 什麼時候應該用BFS? 圖