国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

LeetCode235. 二叉搜索樹的最近公共祖先

這篇具有很好參考價值的文章主要介紹了LeetCode235. 二叉搜索樹的最近公共祖先。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

235. 二叉搜索樹的最近公共祖先


一、題目

給定一個二叉搜索樹, 找到該樹中兩個指定節(jié)點的最近公共祖先。

百度百科中最近公共祖先的定義為:“對于有根樹 T 的兩個結(jié)點 p、q,最近公共祖先表示為一個結(jié)點 x,滿足 x 是 p、q 的祖先且 x 的深度盡可能大(一個節(jié)點也可以是它自己的祖先)?!?/p>

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

LeetCode235. 二叉搜索樹的最近公共祖先,LeetCode刷題,算法,數(shù)據(jù)結(jié)構(gòu),LeetCode,二叉樹

示例 1:

輸入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
輸出: 6 
解釋: 節(jié)點 2 和節(jié)點 8 的最近公共祖先是 6。

示例 2:

輸入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
輸出: 2
解釋: 節(jié)點 2 和節(jié)點 4 的最近公共祖先是 2, 因為根據(jù)定義最近公共祖先節(jié)點可以為節(jié)點本身。

說明:

  • 所有節(jié)點的值都是唯一的。
  • p、q 為不同節(jié)點且均存在于給定的二叉搜索樹中。
二、題解
方法一:遞歸

我們需要充分利用二叉搜索樹的性質(zhì),即左子樹的所有節(jié)點值都小于根節(jié)點值,右子樹的所有節(jié)點值都大于根節(jié)點值。這個性質(zhì)可以幫助我們有效地縮小搜索范圍。

算法思路

  1. 首先,我們要考慮一種簡單情況:如果根節(jié)點的值大于節(jié)點 p 和 q 的值,那么說明 p 和 q 位于根節(jié)點的左子樹中,因為左子樹的所有節(jié)點值都小于根節(jié)點值。我們可以在根節(jié)點的左子樹上繼續(xù)搜索 p 和 q 的最近公共祖先。

  2. 同樣,如果根節(jié)點的值小于節(jié)點 p 和 q 的值,那么說明 p 和 q 位于根節(jié)點的右子樹中,因為右子樹的所有節(jié)點值都大于根節(jié)點值。我們可以在根節(jié)點的右子樹上繼續(xù)搜索 p 和 q 的最近公共祖先。

  3. 但是,如果根節(jié)點的值介于節(jié)點 p 和 q 的值之間,或者根節(jié)點的值等于其中一個節(jié)點的值,那么說明 p 和 q 分別位于根節(jié)點的左右子樹中,此時根節(jié)點就是它們的最近公共祖先。

  4. 我們可以利用遞歸來實現(xiàn)這個過程,根據(jù)上述的思路,遞歸搜索左子樹和右子樹,最終找到最近公共祖先。

具體實現(xiàn)

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (root == nullptr) return nullptr;

        if (root->val > p->val && root->val > q->val) {
            TreeNode* left = lowestCommonAncestor(root->left, p, q);
            return left;
        }
        if (root->val < p->val && root->val < q->val) {
            TreeNode* right = lowestCommonAncestor(root->right, p, q);
            return right;
        }
        
        return root;
    }
};

算法分析

時間復雜度

  • 在每個遞歸步驟中,我們都會根據(jù)節(jié)點的值來決定是繼續(xù)在左子樹搜索還是在右子樹搜索,所以每次遞歸都會剔除一半的節(jié)點。因此,算法的時間復雜度為 O(log N),其中 N 是樹中節(jié)點的總數(shù)。

空間復雜度

  • 遞歸調(diào)用棧的最大深度取決于樹的高度,對于平衡的二叉搜索樹,空間復雜度為 O(log N);對于不平衡的樹,最壞情況下的空間復雜度為 O(N),其中 N 是樹中節(jié)點的總數(shù)。
方法二:迭代

簡單來說,就是把上面的遞歸思路用迭代方式寫一遍:文章來源地址http://www.zghlxwxcb.cn/news/detail-652737.html

/**
 * Definition for a binary tree node.
 * 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) {
        while(root){
            if(root->val > p->val && root->val > q->val){
                root = root->left;
            }else if(root->val < p->val && root->val < q->val){
                root = root->right;
            }else{
                return root;
            }
        }
        return root;
    }
};

到了這里,關(guān)于LeetCode235. 二叉搜索樹的最近公共祖先的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 算法刷題Day 22 二叉搜索樹的最近公共祖先+二叉搜索樹中的插入操作+刪除二叉搜索樹中的節(jié)點

    根據(jù)二叉搜索樹的性質(zhì),相比普通二叉樹可以極大程度的簡化代碼,作為公共祖先其值一定在兩個給定節(jié)點值之間,從樹根往下遍歷,第一次出現(xiàn)兩個給定節(jié)點值之間的值,那個節(jié)點即為最近公共祖先(為什么是最近不是最遠?根節(jié)點一般為最遠,第一次出現(xiàn)的值處于兩個給

    2024年02月17日
    瀏覽(21)
  • Java LeetCode篇-二叉搜索樹經(jīng)典解法(實現(xiàn):二叉搜索樹的最近公共祖先、根據(jù)前序遍歷建樹等)

    Java LeetCode篇-二叉搜索樹經(jīng)典解法(實現(xiàn):二叉搜索樹的最近公共祖先、根據(jù)前序遍歷建樹等)

    ??博客主頁:?【 小扳_-CSDN博客】 ?感謝大家點贊??收藏?評論? ?? 文章目錄 ? ? ? ? 1.0 判斷合法 ????????1.1 使用遍歷方式實現(xiàn)驗證二叉搜索樹 ????????1.2 使用遞歸方式實現(xiàn)驗證二叉搜索樹 ? ? ? ? 2.0 求范圍和 ? ? ? ? 2.1 使用非遞歸實現(xiàn)二叉搜索樹的范圍和

    2024年02月03日
    瀏覽(26)
  • DAY23:二叉樹(十三)二叉樹的最近公共祖先+二叉搜索樹的最近公共祖先

    DAY23:二叉樹(十三)二叉樹的最近公共祖先+二叉搜索樹的最近公共祖先

    一定要仔細看 提示 ,二叉樹 數(shù)值不重復 ,意味著后序遍歷不會存在兩邊找到了同個元素的情況 本題需要進一步理解后序遍歷, 可以認為后序遍歷在\\\"深入\\\"到每個子樹的最深層之后,才開始\\\"回溯\\\"并訪問節(jié)點 。 在某種意義上,這可以被視為從下往上的遍歷方式 , 但需要注

    2024年02月09日
    瀏覽(21)
  • 【Leetcode60天帶刷】day21二叉樹——530.二叉搜索樹的最小絕對差 ,501.二叉搜索樹中的眾數(shù) ,236. 二叉樹的最近公共祖先

    【Leetcode60天帶刷】day21二叉樹——530.二叉搜索樹的最小絕對差 ,501.二叉搜索樹中的眾數(shù) ,236. 二叉樹的最近公共祖先

    530. 二叉搜索樹的最小絕對差 給你一個二叉搜索樹的根節(jié)點? root ?,返回? 樹中任意兩不同節(jié)點值之間的最小差值 ?。 差值是一個正數(shù),其數(shù)值等于兩值之差的絕對值。 示例 1: 示例 2: 提示: 樹中節(jié)點的數(shù)目范圍是? [2, 104] 0 = Node.val = 105 那么二叉搜索樹采用中序遍歷,

    2024年02月10日
    瀏覽(24)
  • leetcode 236. 二叉樹的最近公共祖先

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

    ? ? ? ? 這道題是道面試高頻題,并且有點抽象。 ????????首先確定終止條件。如果根節(jié)點為空,或者其中一個節(jié)點是根節(jié)點本身(即 p == root 或 q == root ),那么根節(jié)點就是它們的最低共同祖先,因此我們直接返回根節(jié)點 root 。? ????????接下來,遞歸調(diào)用 lowestComm

    2024年02月15日
    瀏覽(21)
  • 【Leetcode】二叉樹的最近公共祖先,二叉搜索樹轉(zhuǎn)換成排好序的雙向鏈表,前序遍歷與中序遍歷構(gòu)造二叉樹

    【Leetcode】二叉樹的最近公共祖先,二叉搜索樹轉(zhuǎn)換成排好序的雙向鏈表,前序遍歷與中序遍歷構(gòu)造二叉樹

    二叉樹的最近公共祖先 ?觀察上圖,節(jié)點1和節(jié)點4的最近公共祖先是3,這是不是很像相交鏈表的問題,關(guān)于相交鏈表,曾經(jīng)我在另一篇文章里寫到過,讀者可以參考:反轉(zhuǎn)鏈表 合并鏈表 相交鏈表 但是要轉(zhuǎn)換成相交鏈表,就要從后向前遍歷,如果節(jié)點中還存在一個指針,指向

    2024年02月14日
    瀏覽(23)
  • leetcode熱題100. 二叉樹的最近公共祖先

    leetcode熱題100. 二叉樹的最近公共祖先

    Problem: 236. 二叉樹的最近公共祖先 給定一個二叉樹, 找到該樹中兩個指定節(jié)點的最近公共祖先。 百度百科中最近公共祖先的定義為:“對于有根樹 T 的兩個節(jié)點 p、q,最近公共祖先表示為一個節(jié)點 x,滿足 x 是 p、q 的祖先且 x 的深度盡可能大(一個節(jié)點也可以是它自己的祖先

    2024年01月19日
    瀏覽(19)
  • Java——二叉樹的最近公共祖先及二叉搜索樹介紹

    Java——二叉樹的最近公共祖先及二叉搜索樹介紹

    目錄 二叉樹的最近公共祖先 題目? 思路一:如果給定的是一顆二叉搜索樹, 思路二:假設(shè)是孩子雙親表示法 ?二叉搜索樹 定義Node類 查找 刪除 插入 給定一個二叉樹, 找到該樹中兩個指定節(jié)點的最近公共祖先。 百度百科中最近公共祖先的定義為:“對于有根樹 T 的兩個節(jié)點

    2023年04月08日
    瀏覽(19)
  • 236. 二叉樹的最近公共祖先 ——【Leetcode每日一題】

    236. 二叉樹的最近公共祖先 ——【Leetcode每日一題】

    給定一個二叉樹, 找到該樹中兩個指定節(jié)點的最近公共祖先。 百度百科中最近公共祖先的定義為:“對于有根樹 T 的兩個節(jié)點 p 、 q ,最近公共祖先表示為一個節(jié)點 x ,滿足 x 是 p 、 q 的祖先且 x 的深度盡可能大(一個節(jié)點也可以是它自己的祖先)?!?示例 1: 輸入:root

    2023年04月26日
    瀏覽(21)
  • LeetCode(力扣)236. 二叉樹的最近公共祖先Python

    LeetCode(力扣)236. 二叉樹的最近公共祖先Python

    https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/

    2024年02月10日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包