注意到題目中給出的是一棵「二叉搜尋樹」,因此我們可以快速地找出樹中的某個節點以及從根節點到該節點的路徑,例如我們需要找到節點 pp:
我們從根節點開始遍歷;
如果當前節點就是 pp,那麼成功地找到了節點;
如果當前節點的值大於 pp 的值,說明 pp 應該在當前節點的左子樹,因此將當前節點移動到它的左子節點;
如果當前節點的值小於 pp 的值,說明 pp 應該在當前節點的右子樹,因此將當前節點移動到它的右子節點。
對於節點 qq 同理。在尋找節點的過程中,我們可以順便記錄經過的節點,這樣就得到了從根節點到被尋找節點的路徑。
當我們分別得到了從根節點到 pp 和 qq 的路徑之後,我們就可以很方便地找到它們的最近公共祖先了。顯然,pp 和 qq 的最近公共祖先就是從根節點到它們路徑上的「分岔點」,也就是最後乙個相同的節點。因此,如果我們設從根節點到 pp 的路徑為陣列 \textitpath_p,從根節點到 qq 的路徑為陣列 \textitpath_q,那麼只要找出最大的編號 ii,其滿足
\textit[i] = \textit[i]
path_p[i]=path_q[i]
那麼對應的節點就是「分岔點」,即 pp 和 qq 的最近公共祖先就是 \textit[i]path_p[i](或 \textit[i]path_q[i])
/**
* definition for a binary tree node.
* public class treenode
* }*/class
solution
}return rst;
}public
void
dfs(treenode root,
int tab)
else
if(tab < root.val)
else
}}
235 二叉搜尋樹的最近公共祖先
給定乙個二叉搜尋樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉搜尋樹 root 6,2,8,0,4,7,9,null,null,3,5 示例 1 輸入 root 6,2,8,0,4,7,9,null,null,3,5 p 2,q 8 輸出 6 解釋 節點 2 和節點 8 的最近公共祖先...
235 二叉搜尋樹的最近公共祖先
題目 解題思路 遞迴,二叉搜尋樹兩個點 二叉搜尋樹 二叉查詢樹,主要特點是,根節點比左孩子大,比右孩子小,即左小右大根中間。definition for a binary tree node.function treenode val param root param p param q retur...
235 二叉搜尋樹的最近公共祖先
給定乙個二叉搜尋樹,找到該樹中兩個指定節點的最近公共祖先。公共祖先肯定在pq之間,由於pq不知道誰先所以先判斷一下。class solution object deflowestcommonancestor self,root,p,q type root treenode type p treeno...