236 二叉樹的最近公共祖先

2021-10-19 07:41:37 字數 1131 閱讀 8914

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

最近公共祖先的定義為:「對於有根樹 t 的兩個節點 p、q,最近公共祖先表示為乙個節點 x,滿足 x 是 p、q 的祖先且 x 的深度盡可能大(乙個節點也可以是它自己的祖先)。」

思路:參考【c++ 經典遞迴】思路非常好理解 時間複雜度o(n), 空間複雜度o(n)。

這裡的思路是主要有三種情況:①兩個結點都存在的話,則找出他們的最近公共祖先;②乙個結點存在,另乙個結點不存在的話,則最近公共祖先就是存在的這個結點;③兩個結點都不存在的話,則最近公共祖先不存在(null)。

因此可以用遞迴的方式來求解。

遞迴的終止條件是:①結點為null;②結點本身等於所給的兩個結點中的乙個,返回這個結點即可。

遞迴左右子樹,因為是遞迴,所以使用函式後可認為左右子樹已經算出結果,用 leftleft 和 rightright 表示,即左右子樹算出的所給結點的最近公共祖先。

然後我們判斷 leftleft 和 rightright即可。

主要有以下三種情況:① leftleft 和 rightright其中乙個為null,說明兩個所給結點在同一邊(要麼在左,要麼在右),此時我們返回 leftleft 和 rightright存在的那個即可(因為他們本身就是所求的最近公共最先);②兩個結點都存在,說明兩個結點一邊乙個,則最近公共結點為null;③兩個結點都不存在,返回null即可。

遞迴的思路:①找出遞迴終止的條件;②送入下一層遞迴的引數;③當我們使用遞迴時,不要跟著陷進遞迴的層數里,我們預設此時的遞迴函式能算出結果,我們只需要關注遞迴的結果即可!

c++實現如下:

/**

* definition for a binary tree node.

* struct treenode

* };

*/class solution

};

236 二叉樹最近公共祖先

給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。最近公共祖先的定義為 對於有根樹 t 的兩個結點 p q,最近公共祖先表示為乙個結點 x,滿足 x 是 p q 的祖先且 x 的深度盡可能大 乙個節點也可以是它自己的祖先 例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,nu...

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的最近公共祖先是節點3。示例 2 ...

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 的最近公共祖先是節點 ...