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

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

這篇具有很好參考價(jià)值的文章主要介紹了Java——二叉樹的最近公共祖先及二叉搜索樹介紹。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

二叉樹的最近公共祖先

題目?

思路一:如果給定的是一顆二叉搜索樹,

思路二:假設(shè)是孩子雙親表示法

?二叉搜索樹

定義Node類

查找

刪除

插入


二叉樹的最近公共祖先

題目?

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

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

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

提示:

樹中節(jié)點(diǎn)數(shù)目在范圍 [2, 105] 內(nèi)。
-109 <= Node.val <= 109
所有 Node.val 互不相同 。
p != q
p 和 q 均存在于給定的二叉樹中

思路一:如果給定的是一顆二叉搜索樹,

二叉搜索樹:中序遍歷的大小是有序的,根節(jié)點(diǎn)的左樹都比根節(jié)點(diǎn)的小,根節(jié)點(diǎn)的右樹都比根節(jié)點(diǎn)大。

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

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        //先根據(jù)二叉搜索樹來寫
        if(root==null) return null;
        if(root==p||root==q) return root;
        TreeNode leftT=lowestCommonAncestor(root.left,p,q);
        TreeNode rightT=lowestCommonAncestor(root.right,p,q);
        if(leftT!=null&&rightT!=null){
            return root;
        }else if(leftT!=null){
            return leftT;
        }else{
            return rightT;

        }
        
    }
}

思路二:假設(shè)是孩子雙親表示法

就相當(dāng)于鏈表求交點(diǎn),但是我們的表示中沒有雙親結(jié)點(diǎn),因此我們引入兩個(gè)棧。

Java——二叉樹的最近公共祖先及二叉搜索樹介紹1.用兩個(gè)棧 存儲(chǔ)root->q,root->p的路徑;

2.求棧的大??;

3.讓棧中多的元素出差值個(gè)元素;

4.開始出棧,直到棧頂元素相同,就是公共祖先;

如何去找到從根節(jié)點(diǎn)到一個(gè)指定節(jié)點(diǎn)的路徑??文章來源地址http://www.zghlxwxcb.cn/news/detail-402102.html

class Solution {
    //root根結(jié)點(diǎn),node:指定的節(jié)點(diǎn),stack:存放根節(jié)點(diǎn)到指定節(jié)點(diǎn)的路徑
    public boolean getPath(TreeNode root,TreeNode node ,Stack<TreeNode> stack){
        if(root==null||node==null) return false;
        stack.push(root);
        if(node==root) return true;
        boolean flg=getPath(root.left,node,stack);
        if(flg==true) return true;//找到啦
      flg=getPath(root.right,node,stack);
        if(flg==true) return true;//找到啦
        stack.pop();
        return false;

    }
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null) return null;
        Stack<TreeNode> stack1=new Stack<>();
        getPath(root,p,stack1);
        Stack<TreeNode> stack2=new Stack<>();
        getPath(root,q,stack2);
        int size1=stack1.size();
        int size2=stack2.size();
        if(size1>size2){
            int size=size1-size2;
            while(size!=0){
                stack1.pop();
                size--;
            }
            while(!stack1.isEmpty()&&!stack2.isEmpty()){
                //直接判斷地址
                if(stack1.peek()==stack2.peek()){
                    return stack1.pop();
                }else{
                    stack1.pop();
                    stack2.pop();
                }
            }

        }else{
            int size=size2-size1;
            while(size!=0){
                stack2.pop();
                size--;
            }
            while(!stack1.isEmpty()&&!stack2.isEmpty()){
                //直接判斷地址
                if(stack1.peek()==stack2.peek()){
                    return stack2.pop();
                }else{
                    stack1.pop();
                    stack2.pop();
                }
            }
        }
        return null;



    }
}

?二叉搜索樹

是空樹或者:
若它的左子樹不為空,則左子樹上所有節(jié)點(diǎn)的值都小于根節(jié)點(diǎn)的值
若它的右子樹不為空,則右子樹上所有節(jié)點(diǎn)的值都大于根節(jié)點(diǎn)的值
它的左右子樹也分別為二叉搜索樹

定義Node類

class Node{
    public int val;
    public Node left;
    public Node right;
    public Node(int val){
        this.val=val;
    }
}

查找

  public Node root=null;
    public Node search(int key){
        Node cur = root;
        if(cur.val<key){
            cur = cur.right;
        }else if(cur.val>key){
            cur = cur.left;
        }else{
            return cur;
        }
        return null;
    }

刪除

設(shè)待刪除結(jié)點(diǎn)為 cur, 待刪除結(jié)點(diǎn)的雙親結(jié)點(diǎn)為 parent
1. cur.left == null
1. cur root ,則 root = cur.right
2. cur 不是 root , cur parent.left ,則 parent.left = cur.right
3. cur 不是 root , cur parent.right ,則 parent.right = cur.right
2. cur.right == null
1. cur root ,則 root = cur.left
2. cur 不是 root cur parent.left ,則 parent.left = cur.left
3. cur 不是 root , cur parent.right ,則 parent.right = cur.left
3. cur.left != null && cur.right != null
1. 需要使用 替換法 進(jìn)行刪除,即在它的右子樹中尋找中序下的第一個(gè)結(jié)點(diǎn) ( 關(guān)鍵碼最小 ) ,用它的值填補(bǔ)到被
刪除節(jié)點(diǎn)中,再來處理該結(jié)點(diǎn)的刪除問題
Java——二叉樹的最近公共祖先及二叉搜索樹介紹
   //要?jiǎng)h除節(jié)點(diǎn),你需要知道這個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)
    //當(dāng)要?jiǎng)h除的節(jié)點(diǎn)的左節(jié)點(diǎn)為空
    //一般刪除節(jié)點(diǎn)都是刪除葉子節(jié)點(diǎn)

    public void f(Node cur,Node parent){
        if(cur.left==null){//當(dāng)刪除的節(jié)點(diǎn)左邊沒有節(jié)點(diǎn)
            if(cur==root){
                root=cur.right;
            }else if(cur==parent.left){
                parent.left=cur.right;

            }else{
                parent.right=cur.right;

            }
        }else if(cur.right==null){
            if(cur==root){
                root=cur.left;
            }else if(cur==parent.left){
                parent.left=cur.left;
            }else{
                parent.right=cur.left;
            }
        }else{//左右節(jié)點(diǎn)都不是空
            //相當(dāng)于在右樹中找一個(gè)較小值換到那個(gè)位置
            //或者就是在左樹中找較大值
            //
            Node targetParent=cur;
            Node target=cur.right;
            while(target.left!=null){
                targetParent=target;
                target=target.left;
            }
            cur.val=target.val;
            if(target==targetParent.left){
                targetParent.left=target.right;
            }else{
                targetParent.right=target.right;
            }
        }


    }
    public void remove(int key){
        Node cur=root;
        Node parent=null;
        while(cur!=null){
            if(cur.val==key){
                f(cur,parent);
                break;
            }else if(cur.val<key){
                parent=cur;
                cur=cur.right;
            }else{
                parent=cur;
                cur=cur.left;
            }

        }
    }

插入

   //二叉搜索樹插入的數(shù)據(jù)一定是在葉子節(jié)點(diǎn)
    //1.cur,parent來找到val需要存儲(chǔ)的位置
    //2.parent.val比較大小,確定格式在左邊還是右邊進(jìn)行插入
    public  boolean insert(int val){
        if(root == null){
            root = new Node(val);
            return true;

        }
        Node cur = root;
        Node parent = null;
        //找到parent的位置
        while(cur!=null){
            if(cur.val<val){
                parent=cur;
                cur=cur.right;
            }else if(cur.val==val){//bu
                return false;
            }else{
                parent=cur;
                cur=cur.left;
            }
        }
        //找到對(duì)應(yīng)位置開始插入
        Node node=new Node(val);
        if(parent.val<val){
            parent.right=node;
        }else{
            parent.left=node;
        }
        return true;

    }

到了這里,關(guān)于Java——二叉樹的最近公共祖先及二叉搜索樹介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【算法第十七天8.1】530.二叉搜索樹的最小絕對(duì)差 501.二叉搜索樹中的眾數(shù) 236. 二叉樹的最近公共祖先

    鏈接 力扣530-二叉搜索樹的最小絕對(duì)差 思路 鏈接 力扣501-二叉搜索樹中的眾數(shù) 思路 鏈接 力扣236.二叉樹的最近公共祖先 思路

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

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

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

    2024年02月14日
    瀏覽(23)
  • 力扣236——二叉樹的最近公共祖先

    力扣236——二叉樹的最近公共祖先

    祝大家新年快樂呀,雖這段時(shí)間正值過年,但是我們不要忘記停下學(xué)習(xí)的腳步。今天我們一起看一到力扣上的經(jīng)典二叉樹OJ題,求二叉樹兩個(gè)結(jié)點(diǎn)最近的公共祖先。 https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/description/ 鏈接給大家放在這里啦,大家一點(diǎn)即達(dá) 首先我們

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

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

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

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

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

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

    2024年01月19日
    瀏覽(19)
  • 代碼隨想錄二刷day22 |二叉樹之 235. 二叉搜索樹的最近公共祖先 701.二叉搜索樹中的插入操作 450.刪除二叉搜索樹中的節(jié)點(diǎn)

    235. 二叉搜索樹的最近公共祖先 題目鏈接 解題思路:討論 中節(jié)點(diǎn) p 中節(jié)點(diǎn) q 或者 中節(jié)點(diǎn) q 中節(jié)點(diǎn) p ,其余的情況的最近公共祖先就是根節(jié)點(diǎn)。 使用遞歸三部曲 確定遞歸函數(shù)返回值以及參數(shù) 參數(shù)就是當(dāng)前節(jié)點(diǎn),以及兩個(gè)結(jié)點(diǎn) p、q。 返回值是要返回最近公共祖先,所以是Tr

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

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

    給定一個(gè)二叉樹, 找到該樹中兩個(gè)指定節(jié)點(diǎn)的最近公共祖先。 百度百科中最近公共祖先的定義為:“對(duì)于有根樹 T 的兩個(gè)節(jié)點(diǎn) p 、 q ,最近公共祖先表示為一個(gè)節(jié)點(diǎn) x ,滿足 x 是 p 、 q 的祖先且 x 的深度盡可能大(一個(gè)節(jié)點(diǎn)也可以是它自己的祖先)?!?示例 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)
  • Java LeetCode篇-二叉搜索樹經(jīng)典解法(實(shí)現(xiàn):二叉搜索樹的最近公共祖先、根據(jù)前序遍歷建樹等)

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

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

    2024年02月03日
    瀏覽(27)
  • 【數(shù)據(jù)結(jié)構(gòu)】二叉樹篇|超清晰圖解和詳解:二叉樹的最近公共祖先

    【數(shù)據(jù)結(jié)構(gòu)】二叉樹篇|超清晰圖解和詳解:二叉樹的最近公共祖先

    博主簡(jiǎn)介: 努力學(xué)習(xí)的22級(jí)計(jì)算機(jī)科學(xué)與技術(shù)本科生一枚?? 博主主頁(yè): @是瑤瑤子啦 每日一言??: 你不能要求一片海洋,沒有風(fēng)暴,那不是海洋,是泥塘——畢淑敏 ??236. 二叉樹的最近公共祖先 注意:祖先是 包括自身 的! ??首先要明白,當(dāng) root為p,q的最近祖先節(jié)點(diǎn) ,只

    2024年02月12日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包