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

Leetcoder Day16| 二叉樹 part05

這篇具有很好參考價(jià)值的文章主要介紹了Leetcoder Day16| 二叉樹 part05。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

語言:Java/C++?

513.找樹左下角的值

給定一個(gè)二叉樹的?根節(jié)點(diǎn)?root,請找出該二叉樹的?最底層?最左邊?節(jié)點(diǎn)的值。

假設(shè)二叉樹中至少有一個(gè)節(jié)點(diǎn)。

示例 1:

Leetcoder Day16| 二叉樹 part05,數(shù)據(jù)結(jié)構(gòu),算法

輸入: root = [2,1,3]
輸出: 1

示例 2:

Leetcoder Day16| 二叉樹 part05,數(shù)據(jù)結(jié)構(gòu),算法

輸入: [1,2,3,4,null,5,6,null,null,7]
輸出: 7
本題需要滿足兩個(gè)條件:(1) 最后一行的(2) 最左邊的值。
這里需要明白一個(gè)概念是,最左邊的值未必就是左孩子,右孩子也是可以的。其實(shí)這道題求的是: 深度最大的,從左往右數(shù)的第一個(gè)葉子節(jié)點(diǎn)。因此只要先判斷左再判斷右即可,所以前中后序都可以。

遞歸法

首先如何判斷是否為最后一行:即深度最大的葉子節(jié)點(diǎn)所在即最后一行。
如何找最左邊:保證優(yōu)先左邊搜索即可。
  1. 確定遞歸函數(shù)的參數(shù)和返回值:參數(shù)必須有要遍歷的樹的根節(jié)點(diǎn),額外使用一個(gè)變量來記錄深度,不需要有返回值。設(shè)置一個(gè)全局變量result記錄結(jié)果。
  2. 確定終止條件:當(dāng)遇到葉子節(jié)點(diǎn)時(shí),判斷一下是否為最大深度,用葉子節(jié)點(diǎn)來更新最大深度。
  3. 確定單層遞歸邏輯:在找到最大深度時(shí),遞歸過程依然需要回溯,因?yàn)槿舢?dāng)前已經(jīng)沒有節(jié)點(diǎn),需要返回到上一個(gè)節(jié)點(diǎn)繼續(xù)找另一條路徑進(jìn)行遍歷。
class Solution {
    int maxDepth=-1;
    int result;
    void traversal(TreeNode node, int depth){
        if(node.left==null && node.right==null){ //葉子節(jié)點(diǎn)
            if(depth>maxDepth) {
                maxDepth=depth;
                result=node.val;
            }
        }
        if(node.left!=null){
            depth++;
            traversal(node.left,depth);
            depth--;  //回溯
        }
        if(node.right!=null){
            depth++;
            traversal(node.right,depth);
            depth--;  //回溯
        }
        return;
    }
    public int findBottomLeftValue(TreeNode root) {
        traversal(root,0);
        return result;
    }
}

112.?路徑總和??

給你二叉樹的根節(jié)點(diǎn)? root?和一個(gè)表示目標(biāo)和的整數(shù)? targetSum?。判斷該樹中是否存在? 根節(jié)點(diǎn)到葉子節(jié)點(diǎn)?的路徑,這條路徑上所有節(jié)點(diǎn)值相加等于目標(biāo)和? targetSum?。如果存在,返回? true?;否則,返回? false

示例 1:

Leetcoder Day16| 二叉樹 part05,數(shù)據(jù)結(jié)構(gòu),算法

輸入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
輸出:true
解釋:等于目標(biāo)和的根節(jié)點(diǎn)到葉節(jié)點(diǎn)路徑如上圖所示。
因?yàn)楸绢}需要遍歷到每一條路徑進(jìn)行判斷,所以依然需要回溯。本題沒有對中節(jié)點(diǎn)的處理,所以前中后序都可以。
  1. 遞歸函數(shù)的參數(shù)和返回值:本題需要進(jìn)行判斷是否存在滿足條件的路徑,所以函數(shù)類型為bool,參數(shù)有根節(jié)點(diǎn)和計(jì)數(shù)器count。主函數(shù)里count傳入的是目標(biāo)值減去根節(jié)點(diǎn)的值即target-root.val,因此搜索的過程是一個(gè)做減法的過程,如果到某一個(gè)葉子節(jié)點(diǎn)減去以后剛好count=0,則說明存在滿足條件的路徑。
  2. 終止條件:如果為葉子節(jié)點(diǎn)且count==0,則返回true,否則返回false
  3. 單層遞歸邏輯:即然前中后都可,用前序遍歷,先用count減去當(dāng)前節(jié)點(diǎn)的值,判斷如果當(dāng)前回溯的返回值為true,則繼續(xù)返回true,回溯再把減去的當(dāng)前值加回去。
class Solution {
    boolean traversal(TreeNode node, int count){
        if(node.left==null && node.right==null && count==0) return true;
        if(node.left==null && node.right==null && count!=0) return false;
        //左
        if(node.left!=null){
            count-=node.left.val;
            if(traversal(node.left, count)) return true;  //若之前判斷有滿足條件的,直接true
            count+=node.left.val;
        }
        if(node.right!=null){
            count-=node.right.val;
            if(traversal(node.right, count)) return true;  //若之前判斷有滿足條件的,直接true
            count+=node.right.val;
        }
        return false;
    }
    public boolean hasPathSum(TreeNode root, int targetSum) {
        if(root==null) return false;
        return traversal(root, targetSum-root.val);
    }
}

113.路徑總和ii

和路徑總和1不同的是這里讓給出所有符合條件的路徑,因此返回值發(fā)生了變化,不需要有返回值因?yàn)橐闅v整個(gè)樹,設(shè)置全局變量記錄路徑和結(jié)果。

class Solution {
    List<List<Integer>> res=new ArrayList<>();
    List<Integer> path =new LinkedList<>();

    void traversal(TreeNode node, int count){
        if(node.left==null && node.right == null && count==0){
            //res.add(path);
            res.add(new LinkedList<>(path));
            return;
        }
        if(node.left==null && node.right == null && count!=0) return;
        if(node.left!=null){
            path.add(node.left.val);
            count-=node.left.val;
            traversal(node.left, count);
            count+=node.left.val;
            path.removeLast();
        }
        if(node.right!=null){
            path.add(node.right.val);
            count-=node.right.val;
            traversal(node.right, count);
            count+=node.right.val;
            path.removeLast();
        }
        return;
    }

    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        res.clear();
        path.clear();
        if(root==null) return res;
        path.add(root.val);
        traversal(root, targetSum-root.val);
        return res;

    }
}
??:在將path添加到res中時(shí),如果單純的res.add(path),添加的則是同一個(gè) path的引用,而不是新的路徑。當(dāng)修改 path時(shí),之前添加到 res中的路徑也會(huì)被修改,導(dǎo)致最終結(jié)果中出現(xiàn)重復(fù)的路徑。因此需要在將 path添加到 res中時(shí)創(chuàng)建一個(gè)新的 path對象,而不是使用現(xiàn)有的 path對象。

106.從中序與后序遍歷序列構(gòu)造二叉樹?

根據(jù)一棵樹的中序遍歷與后序遍歷構(gòu)造二叉樹。

注意: 你可以假設(shè)樹中沒有重復(fù)的元素。

例如,給出

  • 中序遍歷 inorder = [9,3,15,20,7]
  • 后序遍歷 postorder = [9,15,7,20,3] 返回如下的二叉樹:
  • Leetcoder Day16| 二叉樹 part05,數(shù)據(jù)結(jié)構(gòu),算法

按照理論知識(shí),給出中序和后序遍歷的時(shí)候,首先需要根據(jù)后序遍歷找出根節(jié)點(diǎn)。隨后根據(jù)根節(jié)點(diǎn)將中序一分為二,然后再根據(jù)中序分出來的結(jié)果切分后序。重復(fù)直到切分完最后一個(gè)節(jié)點(diǎn)。因此需要反復(fù)切割,用到遞歸。
這其中, 為了高效查找根節(jié)點(diǎn)元素在中序遍歷數(shù)組中的下標(biāo),我們選擇創(chuàng)建哈希表來存儲(chǔ)中序序列,即建立一個(gè)(元素,下標(biāo))鍵值對的哈希表。
  1. 遞歸函數(shù)的參數(shù)和返回值:不需要有返回值,參數(shù)則是后序和中序序列
  2. 終止條件:當(dāng)前序列為空
  3. 單層遞歸邏輯:后序數(shù)組的最后一個(gè)元素,根據(jù)這個(gè)元素的值找到在中序數(shù)組的位置root_idx,將中序數(shù)組分為,左中序數(shù)組和右中序數(shù)組。計(jì)算左中序數(shù)組的個(gè)數(shù),以此來確定后序數(shù)組中左后序數(shù)組的個(gè)數(shù)。將后序數(shù)組分為左后序和右后序。將后序數(shù)組中的最后一個(gè)元素去掉。
class Solution {
    Map<Integer, Integer> map;
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        
        return traversal(inorder, 0, inorder.length, postorder, 0, postorder.length);
    }
    public TreeNode traversal(int[] inorder, int inB, int inE, int[] postorder, int postB, int postE){
        if(inB >= inE || postB >= postE) return null;   //返回空樹
        map = new HashMap<>();
        for (int i=0; i<inorder.length;i++){
            map.put(inorder[i], i);    //用map來存放中序數(shù)組的值和位置,以實(shí)現(xiàn)快速查找
        }
        int rootIdx=map.get(postorder[postE-1]);   //在中序數(shù)組中查找后序的最后一個(gè)元素
        TreeNode root = new TreeNode(inorder[rootIdx]);
        int lenofLeft=rootIdx-inB;  //左中數(shù)組的個(gè)數(shù)
        root.left=traversal(inorder, inB, rootIdx, postorder, postB, postB+lenofLeft);   //保持左閉右開
        root.right=traversal(inorder, rootIdx+1, inE, postorder, postB+lenofLeft, postE-1);
        return root;
    }  
}
105.從前序與中序遍歷序列構(gòu)造二叉樹

前序和中序的思路和上面的基本一樣,就是把取后序數(shù)組的最后一個(gè)元素?fù)Q成取前序數(shù)組的第一個(gè)元素即可。文章來源地址http://www.zghlxwxcb.cn/news/detail-832349.html

class Solution {
    Map<Integer, Integer> map;
    public TreeNode traversal(int[] preorder,int preB, int preE, int[] inorder, int inB, int inE){
            if(preE<=preB||inE<=inB) return null;
            map=new HashMap<>();
            for(int i=0; i<inorder.length;i++){
                map.put(inorder[i], i);
            }
            int rootIdx=map.get(preorder[preB]);
            TreeNode root =new TreeNode(inorder[rootIdx]);
            int lengthOfLeft=rootIdx-inB;
            root.left=traversal(preorder, preB+1, lengthOfLeft+preB+1, inorder,inB, rootIdx);
            root.right=traversal(preorder, lengthOfLeft+preB+1, preE, inorder, rootIdx+1, inE);
            return root;
    }
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return traversal(preorder, 0, preorder.length, inorder, 0, inorder.length);
    }
}

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

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

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

相關(guān)文章

  • Leetcoder Day39| 動(dòng)態(tài)規(guī)劃part06 完全背包問題

    Leetcoder Day39| 動(dòng)態(tài)規(guī)劃part06 完全背包問題

    有N件物品和一個(gè)最多能背重量為W的背包。第i件物品的重量是weight[i],得到的價(jià)值是value[i] 。 每件物品都有無限個(gè)(也就是可以放入背包多次) ,求解將哪些物品裝入背包里物品價(jià)值總和最大。 示例: 背包最大重量為4。 物品為: 重量 價(jià)值 物品0 1 15 物品1 3 20 物品2 4 30 每

    2024年03月25日
    瀏覽(24)
  • 算法訓(xùn)練day16Leetcode104二叉樹最大深度111二叉樹最小深度222完全二叉樹的節(jié)點(diǎn)個(gè)數(shù)

    https://www.bilibili.com/video/BV1Gd4y1V75u/?vd_source=8272bd48fee17396a4a1746c256ab0ae 用遞歸,但是什么順序沒想清楚 二叉樹節(jié)點(diǎn)的深度:指從根節(jié)點(diǎn)到該節(jié)點(diǎn)的最長簡單路徑邊的條數(shù)或者節(jié)點(diǎn)數(shù)(取決于深度從0開始還是從1開始) 二叉樹節(jié)點(diǎn)的高度:指從該節(jié)點(diǎn)到葉子節(jié)點(diǎn)的最長簡單路徑邊

    2024年01月16日
    瀏覽(28)
  • day16 二叉樹的最大深度 n叉樹的最大深度 二叉樹的最小深度 完全二叉樹的節(jié)點(diǎn)數(shù)

    day16 二叉樹的最大深度 n叉樹的最大深度 二叉樹的最小深度 完全二叉樹的節(jié)點(diǎn)數(shù)

    題目鏈接:104 二叉樹的最大深度 題意 二叉樹的根節(jié)點(diǎn)是root,返回其最大深度(從根節(jié)點(diǎn)到最遠(yuǎn)葉子節(jié)點(diǎn)的最長路徑上的節(jié)點(diǎn)數(shù)) 遞歸 根節(jié)點(diǎn)的的高度就是二叉樹的最大深度? 所以使用后序遍歷求最大高度的方式求出最大深度 遞歸三部曲 1)確定遞歸函數(shù)的參數(shù)和返回值

    2024年02月02日
    瀏覽(79)
  • 算法刷題Day 16 二叉樹的最大深度+N叉樹的最大深度+二叉樹的最小深度+完全二叉樹的節(jié)點(diǎn)個(gè)數(shù)

    遞歸法 迭代法 使用層序的方法,相對比較好理解 遞歸法 迭代法 跟二叉樹的迭代差不多意思。 要想到是后序遍歷 遞歸法 先計(jì)算左右兩棵子樹的節(jié)點(diǎn)數(shù),再加和,用后序遍歷的方法 迭代法 迭代法用層序遍歷來處理 適用于完全二叉樹的優(yōu)化 完全二叉樹優(yōu)化方法沒自己想出來

    2024年02月17日
    瀏覽(33)
  • 【LeetCode題目詳解】第八章 貪心算法 part06 738.單調(diào)遞增的數(shù)字 968.監(jiān)控二叉樹 (day37補(bǔ))

    【LeetCode題目詳解】第八章 貪心算法 part06 738.單調(diào)遞增的數(shù)字 968.監(jiān)控二叉樹 (day37補(bǔ))

    當(dāng)且僅當(dāng)每個(gè)相鄰位數(shù)上的數(shù)字? x ?和? y ?滿足? x = y ?時(shí),我們稱這個(gè)整數(shù)是 單調(diào)遞增 的。 給定一個(gè)整數(shù) n ,返回 小于或等于 n 的最大數(shù)字,且數(shù)字呈 單調(diào)遞增 。 示例 1: 示例 2: 示例 3: 提示: 0 = n = 109 # 暴力解法 題意很簡單,那么首先想的就是暴力解法了,來我替大家

    2024年02月10日
    瀏覽(20)
  • 【數(shù)據(jù)結(jié)構(gòu)-二叉樹】二叉樹

    【數(shù)據(jù)結(jié)構(gòu)-二叉樹】二叉樹

    ??????歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內(nèi)容和知識(shí),也可以暢所欲言、分享您的想法和見解。 推薦:kuan 的首頁,持續(xù)學(xué)習(xí),不斷總結(jié),共同進(jìn)步,活到老學(xué)到老 導(dǎo)航 檀越劍指大廠系列:全面總

    2024年02月07日
    瀏覽(35)
  • 數(shù)據(jù)結(jié)構(gòu):搜索二叉樹 | 平衡二叉樹

    數(shù)據(jù)結(jié)構(gòu):搜索二叉樹 | 平衡二叉樹

    博客寫的代碼都放在這里:gitee倉庫鏈接 1.二叉搜索樹 1.1.基本概念 二叉搜索樹又稱二叉排序樹, 可以為空,如果不為空具有以下性質(zhì)的二叉樹 : 若它的左子樹不為空,則左子樹上所有節(jié)點(diǎn)的值都小于根節(jié)點(diǎn)的值 若它的右子樹不為空,則右子樹上所有節(jié)點(diǎn)的值都大于根節(jié)點(diǎn)的

    2024年01月23日
    瀏覽(36)
  • 數(shù)據(jù)結(jié)構(gòu)-二叉樹-二叉樹左右孩子交換(遞歸)

    ?注:本文采用隊(duì)列和遞歸的算法進(jìn)行創(chuàng)建和層次遍歷。同時(shí)不能采用BFS和DFS,因?yàn)樾枰旬?dāng)前根節(jié)點(diǎn)的左孩、右孩勾鏈并輸入才能遞歸下一個(gè)根節(jié)點(diǎn); 隊(duì)列用于存儲(chǔ)此時(shí)應(yīng)該遞歸的根節(jié)點(diǎn); 格式:每一行尾不能有空格; Description 根據(jù)輸入利用二叉鏈表創(chuàng)建二叉樹,并將所

    2024年02月04日
    瀏覽(38)
  • 【數(shù)據(jù)結(jié)構(gòu)】二叉樹的介紹和二叉樹堆

    【數(shù)據(jù)結(jié)構(gòu)】二叉樹的介紹和二叉樹堆

    ??作者簡介: 加油,旭杏,目前大二,正在學(xué)習(xí) C++ , 數(shù)據(jù)結(jié)構(gòu) 等?? ??作者主頁:加油,旭杏的主頁?? ?本文收錄在:再識(shí)C進(jìn)階的專欄?? ??代碼倉庫:旭日東升 1?? ??歡迎大家點(diǎn)贊 ?? 收藏 ? 加關(guān)注哦!?? ???????樹這一概念,在我們剛開始聽說的時(shí)候會(huì)覺得

    2024年01月20日
    瀏覽(34)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包