給定乙個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。
例如,給定如下二叉樹: 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 的最近公共祖先...