leetcode 二叉樹的最近公共祖先

2021-09-09 05:42:38 字數 1300 閱讀 8420

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

例如,給定如下二叉樹: 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 為不同節點且均存在於給定的二叉樹中。

思路:這道題想要得到任意兩個結點(a和b)的最近公共祖先節點,那麼我們倘若將到

達兩個結點的路徑都列出來,那公共祖先結點一定在這兩條路徑上,且在最靠後的位

置,在對比倒著挨個查詢就能得到結果。那我們怎麼獲得這個路徑呢?

我們可以用2個棧來儲存這兩個結點的路徑,每當遇到乙個結點,我們就先將這個結點

先入棧(因為每個結點都有可能是最終路徑上的結點),然後檢視這個結點是否是

我們最終要找的那兩個結點,如果是,則當前棧裡的結點順序就是我們想要的路

徑,結束查詢,如果不是,遞迴的去該結點的左子樹和右子樹里查詢,如果都沒

有找到,說明以該子樹沒有我們想要的結點,自然它肯定不在最終路徑上,將其

出棧即可。

**實現:

#include#includeusing namespace std;

struct treenode

};//思路:

// 1.用兩個棧分別記錄到值a,b的路徑

// 2.讓兩個棧當中多的那個棧出棧,直到兩個棧size()相同

// 3.再同時出棧直到找到相同結點,相同結點即使最近祖先

class solution

treenode* lowestcommonancestor(treenode* root, treenode* p, treenode* q)

} else

}while (s1.top() != s2.top())//倒著找最先重複的結點,就是最近的公共祖先

return s1.top();

}};

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

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

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