0235-二叉搜尋樹的最近公共祖先
二叉搜尋樹的最近公共祖先
方案一
由於二叉搜尋樹的特點是左<根<右,所以根節點的值一直都是中間值,大於左子樹的所有節點值,小於右子樹的所有節點值,那麼我們可以做如下的判斷,如果根節點的值大於p和q之間的較大值,說明p和q都在左子樹中,那麼此時我們就進入根節點的左子節點繼續遞迴,如果根節點小於p和q之間的較小值,說明p和q都在右子樹中,那麼此時我們就進入根節點的右子節點繼續遞迴,如果都不是,則說明當前根節點就是最小共同父節點,直接返回即可
C++-原始碼
#include <iostream>
//#include <queue>
//#include <unordered_map>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (!root) {
return root;
}
if (root->val > max(p->val, q->val)) {
return lowestCommonAncestor(root->left, p, q);
}
else if (root->val < min(p->val, q->val)) {
return lowestCommonAncestor(root->right, p, q);
}
else {
return root;
}
}
};
方案二
如果當前結點不為空,且既不是p也不是q,那麼根據上面的分析,p和q的位置就有三種情況,p和q要麼分別位於左右子樹中,要麼同時位於左子樹,或者同時位於右子樹。我們需要優化的情況就是當p和q同時為於左子樹或右子樹中,而且返回的結點並不是p或q,那麼就是p和q的最小父結點了,已經求出來了,就不用再對右結點呼叫遞迴函式了
C++-原始碼
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
while (true) {
if (root->val > max(p->val, q->val)) {
root = root->left;
}
else if (root->val < min(p->val, q->val)) {
root = root->right;
}
else {
return root;
}
}
}
};
相關文章
- 二叉搜尋樹和二叉樹的最近公共祖先二叉樹
- leetcode 235. 二叉搜尋樹的最近公共祖先LeetCode
- (117)235. 二叉搜尋樹的最近公共祖先(leetcode)LeetCode
- 二叉樹的最近公共祖先二叉樹
- 【leetcode 簡單】 第六十八題 二叉搜尋樹的最近公共祖先LeetCode
- 程式碼隨想錄day18 || 530 二叉搜尋樹最小差,501 二叉搜尋樹眾數,236 二叉搜尋樹最近公共祖先
- Day21 | 530.二叉搜尋樹的最小絕對差、501.二叉搜尋樹中的眾數 、236. 二叉樹的最近公共祖先二叉樹
- 樹的最近公共祖先問題
- # 劍指 Offer 68 - II. 二叉樹的最近公共祖先二叉樹
- lc235.二叉搜尋樹的最近公共祖先【①分別得到祖先序列,然後比較;②***同時查詢,找出分岔結點】
- 最近公共祖先
- 程式碼隨想錄演算法訓練營第22天 |二叉樹part07:235. 二叉搜尋樹的最近公共祖先、701.二叉搜尋樹中的插入操作、450.刪除二叉搜尋樹中的節點演算法二叉樹
- 程式碼隨想錄演算法訓練營第19天|235. 二叉搜尋樹的最近公共祖先 ,701.二叉搜尋樹中的插入操作,450.刪除二叉搜尋樹中的節點演算法
- 程式碼隨想錄演算法訓練營day19| 235. 二叉搜尋樹的最近公共祖先 701.二叉搜尋樹中的插入操作 450.刪除二叉搜尋樹中的節點演算法
- 程式碼隨想錄演算法訓練營day22 | leetcode 235. 二叉搜尋樹的最近公共祖先、701. 二叉搜尋樹中的插入操作、450. 刪除二叉搜尋樹中的節點演算法LeetCode
- 程式碼隨想錄演算法訓練營第18天| 530.二叉搜尋樹的最小絕對差, 501.二叉搜尋樹中的眾數 , 236. 二叉樹的最近公共祖先演算法二叉樹
- 程式碼隨想錄演算法訓練營day18 |530.二叉搜尋樹的最小絕對差 501.二叉搜尋樹中的眾數 236. 二叉樹的最近公共祖先演算法二叉樹
- LCA最近公共祖先
- LeetCode——最近公共祖先LeetCode
- 最近公共祖先 LCA
- 二叉樹:距離最近的共同祖先二叉樹
- 程式碼隨想錄演算法訓練營第二十二天 | 235.二叉搜尋樹的最近公共祖先 701.二叉搜尋樹中的插入操作 450.刪除二叉搜尋樹中的節點演算法
- 22天【程式碼隨想錄演算法訓練營34期】第六章 二叉樹part08 (● 235. 二叉搜尋樹的最近公共祖先 ● 701.二叉搜尋樹中的插入操作 ● 450.刪除二叉搜尋樹中的節點)演算法二叉樹
- Day 5 LCA 最近公共祖先
- Google S2 中的四叉樹求 LCA 最近公共祖先Go
- 樹上問題/簡單演算法 LCA【最近公共祖先】演算法
- 二叉搜尋樹
- 236、二叉樹的最近公共祖先 | 演算法(leetcode,附思維導圖 + 全部解法)300題二叉樹演算法LeetCode
- 樹上公共祖先(LCA)
- Git 中的演算法-最近公共祖先Git演算法
- 二叉搜尋樹的結構
- 二叉搜尋樹的操作集
- Day20 | 654.最大二叉樹 、 617.合併二叉樹 、 700.二叉搜尋樹中的搜尋 98.驗證二叉搜尋樹二叉樹
- 「學習筆記」tarjan 求最近公共祖先筆記
- LeetCode 236. 二叉樹的最近公共祖先 極限效能演算法 比LeetCode 99%還快50倍LeetCode二叉樹演算法
- 從二分搜尋到二叉搜尋樹
- Leetcode 700. 二叉搜尋樹中的搜尋(DAY 2)LeetCode
- 96. 不同的二叉搜尋樹