最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java二叉樹中LCA問題解決方法兩則

 更新時間:2022年12月05日 11:36:22   作者:敲代碼の流川楓  
這篇文章主要介紹了Java二叉樹中LCA問題解決方法,總的來說這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達(dá)的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過程。希望通過這道題能給你帶來一種解題優(yōu)化的思路

尋找公共祖先

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

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

方法一-普通解法

思路:可以看作鏈表求交點(diǎn)的問題

首先需要找到到達(dá)兩個節(jié)點(diǎn)的路徑并用棧保存下來,然后讓他們在同一起點(diǎn),即路徑長的先釋放掉兩個路徑長的差值,然后兩個棧依次彈出棧頂元素,若相同,則是這兩個節(jié)點(diǎn)的公共祖先 。比較難的是怎樣找到到達(dá)節(jié)點(diǎn)的路徑,定義一個棧,從根節(jié)點(diǎn)開始遍歷,棧先存儲根節(jié)點(diǎn),然后判斷是否等于要找的節(jié)點(diǎn),不等于則繼遍歷根節(jié)點(diǎn)的左右子樹,左右子樹又是新的根節(jié)點(diǎn),如果左右子樹不為要找的節(jié)點(diǎn),則遍歷他們的子樹,還是找不到,則出棧,即這個節(jié)點(diǎn)不在要找的節(jié)點(diǎn)的路徑里

代碼

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null || p == null || q== 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();
        int size = 0;
        if(size1 > size2){
             size = size1 - size2;
             while(size>0){
                 stack1.pop();
                 size--;
             }
        }
        else{
            size = size2 - size1;
            while(size>0){
                stack2.pop();
                size--;
            }
        }
        //起點(diǎn)已經(jīng)相同
        while(stack1.peek() != stack2.peek()){
            stack2.pop();
            stack1.pop();
        }
        return stack1.peek();
    }
    public boolean getPath(TreeNode root,TreeNode node,Stack<TreeNode> stack){
        if(root == null || node == null){
            return false;
        }
        stack.push(root);
        if(root == node){
            return true;
        }
        boolean flag1 = getPath(root.left,node,stack);
        if(flag1 == true){
            return true;
        }
        boolean flag2 = getPath(root.right,node,stack);
        if(flag2 == true){
            return true;
        }
        stack.pop();
        return false;
    }
}

方法二-子問題

pq的分布為以上三種情況,pq為root時,就是公共祖先,若不是這種情況,則遞歸調(diào)用尋找root的左右子樹節(jié)點(diǎn)是否有p或q。pq分布在root左右兩側(cè)時,root就是公共祖先,pq分布在單側(cè)時,先找到的即為兩個節(jié)點(diǎn)的公共祖先。子問題體現(xiàn)在尋找pq時,每個子樹都會調(diào)用函數(shù)

代碼

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
       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 if(rightT != null){
           return rightT;
       }
       else{
           return null;
       }
    }
}

到此這篇關(guān)于Java二叉樹中LCA問題解決方法兩則的文章就介紹到這了,更多相關(guān)Java二叉樹中LCA問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • idea項(xiàng)目文件夾橫向顯示,縱向顯示的解決方法

    idea項(xiàng)目文件夾橫向顯示,縱向顯示的解決方法

    這篇文章主要介紹了idea項(xiàng)目文件夾橫向顯示,縱向顯示的解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • java實(shí)現(xiàn)簡易外賣訂餐系統(tǒng)

    java實(shí)現(xiàn)簡易外賣訂餐系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡易外賣訂餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • nacos一直頻繁的打印日志get changegroupkeys問題

    nacos一直頻繁的打印日志get changegroupkeys問題

    這篇文章主要介紹了nacos一直頻繁的打印日志get changegroupkeys問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 使用maven對springboot項(xiàng)目進(jìn)行瘦身分離jar的多種處理方案

    使用maven對springboot項(xiàng)目進(jìn)行瘦身分離jar的多種處理方案

    springboot項(xiàng)目打包一般我們都使用它自帶的spring-boot-maven-plugin插件,這個插件默認(rèn)情況下,會把所有的依賴包全部壓縮到一個jar里面,今天給大家分享幾種方案來如何減小我們的打包文件,需要的朋友可以參考下
    2024-02-02
  • Spring中@RefreshScope注解的處理方法詳解

    Spring中@RefreshScope注解的處理方法詳解

    這篇文章主要介紹了Spring中@RefreshScope注解的處理方法詳解,spring啟動時會調(diào)用ClassPathBeanDefinitionScanner.java類中的doScan()對包路徑下的所有class進(jìn)行掃描,獲取bean的定義,同時對bean的@RefreshScope(@Scope的父類)進(jìn)行處理,需要的朋友可以參考下
    2023-10-10
  • JNI實(shí)現(xiàn)最簡單的JAVA調(diào)用C/C++代碼

    JNI實(shí)現(xiàn)最簡單的JAVA調(diào)用C/C++代碼

    這篇文章主要介紹了JNI實(shí)現(xiàn)最簡單的JAVA調(diào)用C/C++代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • SpringBoot如何設(shè)置404、500返回統(tǒng)一格式j(luò)son

    SpringBoot如何設(shè)置404、500返回統(tǒng)一格式j(luò)son

    這篇文章主要介紹了SpringBoot如何設(shè)置404、500返回統(tǒng)一格式j(luò)son問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Mybatis 級聯(lián)刪除的實(shí)現(xiàn)

    Mybatis 級聯(lián)刪除的實(shí)現(xiàn)

    這篇文章主要介紹了Mybatis 級聯(lián)刪除的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • SpringBoot使用自動配置xxxAutoConfiguration

    SpringBoot使用自動配置xxxAutoConfiguration

    這篇文章介紹了SpringBoot自動配置xxxAutoConfiguration的使用方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • Java線程的調(diào)度與優(yōu)先級詳解

    Java線程的調(diào)度與優(yōu)先級詳解

    這篇文章主要為大家詳細(xì)介紹了Java線程的調(diào)度與優(yōu)先級,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03

最新評論

嘉峪关市| 呼玛县| 武平县| 宾阳县| 扬中市| 浦北县| 高台县| 岫岩| 安康市| 白沙| 陈巴尔虎旗| 高清| 中卫市| 黔江区| 盐池县| 内江市| 安阳市| 手机| 怀仁县| 仪陇县| 永泰县| 会泽县| 大丰市| 南岸区| 金昌市| 黎城县| 张家港市| 中超| 集贤县| 策勒县| 钦州市| 三亚市| 黄龙县| 肥西县| 环江| 定边县| 定州市| 大洼县| 阜城县| 丰宁| 巫山县|