leetcode 236 二叉樹的最近公共祖先

2021-10-06 22:11:09 字數 1501 閱讀 2155

給定乙個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。

例如,給定如下二叉樹: root = [3,5,1,6,2,0,8,null,null,7,4]

示例 1:

輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1

輸出: 3

解釋: 節點 5 和節點 1 的最近公共祖先是節點 3。

示例 2:

輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4

輸出: 5

解釋: 節點 5 和節點 4 的最近公共祖先是節點 5。因為根據定義最近公共祖先節點可以為節點本身。

說明:所有節點的值都是唯一的。

p、q 為不同節點且均存在於給定的二叉樹中。

通過次數87,242提交次數136,607

思路:

遞迴遍歷二叉樹,記錄遍歷的路徑,當遍歷到目標子節點的時候,將當前的路徑陣列儲存下來,最後比對兩個路徑陣列,最後乙個相同的節點即為最近公共祖先。

ps:這道題對我來說有故事的,之前阿里面試實習的時候問了一道比這個更簡單的問題,是有雙向二叉樹求最近公共祖先,實質上可以轉化為兩個相交的鍊錶求交點,但無奈當時太弱雞(雖然現在也很弱雞,但不至於相交鍊錶求交點也做不出來),繼續加油吧,刷題的感覺是要比以前摳破腦袋倆小時一道easy來得順暢多了,任重而道遠,目標秋招奧利給!!!!!!

/**

* definition for a binary tree node.

* struct treenode

* };

*/class

solution

else

}return ret;

}void

dfs(treenode* p,treenode*q,treenode* node,vector

>

&temp,vector

>

&vec1,vector

>

&vec2)

temp.

push_back

(node);if

(node==p)

if(node==q)

if(vec1.

size()

!=0&&vec2.

size()

!=0)return

;dfs

(p,q,node-

>left,temp,vec1,vec2)

;dfs

(p,q,node-

>right,temp,vec1,vec2)

; temp.

pop_back()

;}};

LeetCode236 二叉樹最近祖先

思考 這個函式就是查詢p,q兩個節點的祖先,然後給了這棵樹的root,1 它先進行判斷,根節點是不是null 或者根節點是否是p q,要是有乙個是,那祖先就肯定是root 2 它用了遞迴的思想去查詢左右兩個子樹,因為pq的祖先要麼在左邊,要麼就在右邊,所以肯定能找到乙個祖先。3 若找到的left 子...

LeetCode 236 二叉樹最近公共祖先

leetcode 236 二叉樹最近公共祖先 236.二叉樹的最近公共祖先 題目描述 給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。解體思路 分兩部分解決 第一部分 實現判斷兩個結點包含於某根節點的子樹內 第二部分 先序遍歷二叉樹,如果根節點的子樹包含qp目標結點 傳入左孩子,進行遞迴。傳入...

leetcode 236 二叉樹最近公共祖先

給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,null,7,4 示例 1 輸入 root 3,5,1,6,2,0,8,null,null,7,4 p 5,q 1 輸出 3 解釋 節點 5 和節點 1 的最近公共祖先是節點 ...