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

Java 數(shù)據(jù)結(jié)構(gòu)中二叉樹前中后序遍歷非遞歸的具體實(shí)現(xiàn)詳解

 更新時(shí)間:2021年11月09日 17:15:35   作者:dhdhdhdhg  
樹是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹中稱為結(jié)點(diǎn))按分支關(guān)系組織起來(lái)的結(jié)構(gòu),很象自然界中的樹那樣。樹結(jié)構(gòu)在客觀世界中廣泛存在,如人類社會(huì)的族譜和各種社會(huì)組織機(jī)構(gòu)都可用樹形象表示

一、前序遍歷

1.題目描述

給你二叉樹的根節(jié)點(diǎn) root ,返回它節(jié)點(diǎn)值的 前序 遍歷。

2.輸入輸出示例

示例 1:

在這里插入圖片描述

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

輸出:[1,2,3]

示例2:

輸入:root = []

輸出:[]

示例 3:

輸入:root = [1]

輸出:[1]

3.解題思路

前序遍歷:根結(jié)點(diǎn)—左子樹—右子樹

在這里插入圖片描述

1.判斷額外情況,如果樹為空,直接返回
2.創(chuàng)建一個(gè)棧用來(lái)保存右子樹
3.先將根結(jié)點(diǎn)入棧,避免多次判斷棧為空
4.取出棧頂元素(第一次為根結(jié)點(diǎn)),從上往下遍歷最左側(cè)路徑中的每個(gè)結(jié)點(diǎn)
5.在遍歷時(shí)判斷當(dāng)前結(jié)點(diǎn)的右子樹是否為空,非空則入棧
6.遍歷結(jié)束后,此時(shí)棧頂元素為前一個(gè)結(jié)點(diǎn)的右子樹,將棧頂元素取出,將其看作一棵樹,繼續(xù)重復(fù)上述操作,即形成循環(huán)。

4.代碼實(shí)現(xiàn)

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<>();
        if(root==null){
            return list;
        }

        //創(chuàng)建一個(gè)棧用來(lái)保存右子樹
        Stack<TreeNode> s=new Stack<>();
        TreeNode cur=root;
        s.push(root);
        //從上往下遍歷最左側(cè)路徑中的每個(gè)結(jié)點(diǎn),并將其右子樹保存起來(lái)---棧
        while(!s.empty()||cur!=null){
            cur=s.pop();
            while(cur!=null){
                list.add(cur.val);
                if(cur.right!=null){
                    s.push(cur.right);
                }
                cur=cur.left; 
            }
        }
        return list;
    }
}

二、中序遍歷

1.題目描述

給定一個(gè)二叉樹的根節(jié)點(diǎn) root ,返回它的 中序 遍歷。

2.輸入輸出示例

示例 1:

在這里插入圖片描述

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

輸出:[1,3,2]

示例 2:

輸入:root = []

輸出:[]

示例 3:

輸入:root = [1]

輸出:[1]

3.解題思路

中序遍歷:左子樹—根結(jié)點(diǎn)—右子樹

在這里插入圖片描述

1.判斷額外情況,如果樹為空,直接返回
2.創(chuàng)建一個(gè)棧用來(lái)保存結(jié)點(diǎn)
3.從上往下遍歷最左側(cè)路徑中的每個(gè)結(jié)點(diǎn),并將其保存到棧中,走到cur==null的位置
4.此時(shí)棧頂元素為最左側(cè)路徑的最后一個(gè)結(jié)點(diǎn),將其加入到list并將棧頂元素移除
5.判斷最后一個(gè)結(jié)點(diǎn)的右子樹是否為空,過(guò)程和上述的過(guò)程是一樣的,直接將其右子樹看作一棵樹,整個(gè)過(guò)程便循環(huán)起來(lái)

4.代碼實(shí)現(xiàn)

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<>();
        if(root==null){
            return list;
        }
        Stack<TreeNode> s=new Stack<>();
        TreeNode cur=root;
         //從上往下遍歷最左側(cè)路徑中的每個(gè)結(jié)點(diǎn),并將其保存到棧中
        while(!s.empty()||cur!=null){
            while(cur!=null){
                s.push(cur);
                cur=cur.left;
            }
            cur=s.pop();
            list.add(cur.val);
            cur=cur.right;
        }
        return list;
    }
}

三、后序遍歷

1.題目描述

給定一個(gè)二叉樹,返回它的 后序 遍歷。

2.輸入輸出示例

示例:
輸入: [1,null,2,3]
1
\
2
/
3

輸出: [3,2,1]

3.解題思路

后序遍歷:左子樹—右子樹—根結(jié)點(diǎn)

在這里插入圖片描述

1.判斷額外情況,如果樹為空,直接返回
2.創(chuàng)建一個(gè)棧用來(lái)保存遍歷的結(jié)點(diǎn)
3找出以cur為根的二叉樹中最左側(cè)的節(jié)點(diǎn),并保存所經(jīng)路徑中的所有結(jié)點(diǎn)—棧
4.此時(shí)棧頂元素為最左側(cè)路徑的最后一個(gè)結(jié)點(diǎn)
5.先要判斷最后一個(gè)結(jié)點(diǎn)的右子樹是否為空

如果為空,直接將結(jié)點(diǎn)加入list,同時(shí)將棧頂元素刪除
如果不為空則將右子樹看作一棵樹,重新進(jìn)入循環(huán)判斷

注意:如果按照這樣,到了最后的右子樹就會(huì)一直循環(huán)出不來(lái)
解決方案:
創(chuàng)建一個(gè)prev用來(lái)標(biāo)記已經(jīng)遍歷過(guò)的結(jié)點(diǎn),將能否編歷的條件改為:top的右子樹為空||top的右子樹已經(jīng)遍歷過(guò)

4.代碼實(shí)現(xiàn)

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<>();
        if(root==null){
            return list;
        }
        Stack<TreeNode> s=new Stack<>();
        TreeNode cur=root;
        TreeNode prev=null;//用來(lái)標(biāo)記剛剛遍歷過(guò)的節(jié)點(diǎn)
        while(!s.empty()||cur!=null){
            //1.找出以cur為根的二叉樹中最左側(cè)的節(jié)點(diǎn),并保存所經(jīng)路徑中的所有節(jié)點(diǎn)---棧
            while(cur!=null){
                s.push(cur);
                cur=cur.left;
            }
            TreeNode top=s.peek();
            //top能否遍歷:top的右子樹為空||top的右子樹已經(jīng)遍歷過(guò)
            if(top.right==null||top.right==prev){
                list.add(top.val);
                prev=top;
                s.pop();
            }else{
                cur=top.right;
            }  
        }
        return list;
    }
}

以上就是Java 數(shù)據(jù)結(jié)構(gòu)中二叉樹前中后序遍歷非遞歸的具體實(shí)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于Java 數(shù)據(jù)結(jié)構(gòu)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java設(shè)計(jì)模式編程中的責(zé)任鏈模式使用示例

    Java設(shè)計(jì)模式編程中的責(zé)任鏈模式使用示例

    這篇文章主要介紹了Java設(shè)計(jì)模式編程中的責(zé)任鏈模式使用示例,責(zé)任鏈模式可以避免很多請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系,需要的朋友可以參考下
    2016-05-05
  • Spring IOC 三種配置方式詳解

    Spring IOC 三種配置方式詳解

    這篇文章主要介紹了Spring IOC 三種配置方式,基于xml配置方式組件管理,基于注解方式管理和配置類方式管理,這三種方式,通過(guò)圖文講解的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • IDEA 中創(chuàng)建Spring Data Jpa 項(xiàng)目的示例代碼

    IDEA 中創(chuàng)建Spring Data Jpa 項(xiàng)目的示例代碼

    這篇文章主要介紹了IDEA 中創(chuàng)建Spring Data Jpa 項(xiàng)目的示例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • springboot mybatis里localdatetime序列化問(wèn)題的解決

    springboot mybatis里localdatetime序列化問(wèn)題的解決

    這篇文章主要介紹了springboot mybatis里localdatetime序列化問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • 為什么 Java 8 中不需要 StringBuilder 拼接字符串

    為什么 Java 8 中不需要 StringBuilder 拼接字符串

    java8中,編輯器對(duì)“+”進(jìn)行了優(yōu)化,默認(rèn)使用StringBuilder進(jìn)行拼接,所以不用顯示的使用StringBuilder了,直接用“+”就可以了。下面我們來(lái)詳細(xì)了解一下
    2019-05-05
  • Java設(shè)計(jì)模式之狀態(tài)模式詳解

    Java設(shè)計(jì)模式之狀態(tài)模式詳解

    Java?中的狀態(tài)模式(State?Pattern)是一種行為型設(shè)計(jì)模式,它允許對(duì)象在內(nèi)部狀態(tài)發(fā)生改變時(shí)改變其行為,本文將詳細(xì)介紹?Java?中的狀態(tài)模式,我們將從狀態(tài)模式的概述、結(jié)構(gòu)與實(shí)現(xiàn)、優(yōu)缺點(diǎn)、適用場(chǎng)景等方面進(jìn)行講解,需要的朋友可以參考下
    2023-05-05
  • Spring?Boot?優(yōu)雅整合多數(shù)據(jù)源

    Spring?Boot?優(yōu)雅整合多數(shù)據(jù)源

    這篇文章主要介紹了Spring?Boot?優(yōu)雅整合多數(shù)據(jù)源,多數(shù)據(jù)源就是在一個(gè)單一應(yīng)用中涉及到了兩個(gè)及以上的數(shù)據(jù)庫(kù),更多相關(guān)內(nèi)容需要的小伙伴可以參考下面文章介紹
    2022-05-05
  • springboot+vue?若依項(xiàng)目在windows2008R2企業(yè)版部署流程分析

    springboot+vue?若依項(xiàng)目在windows2008R2企業(yè)版部署流程分析

    這篇文章主要介紹了springboot+vue?若依項(xiàng)目在windows2008R2企業(yè)版部署流程,本次使用jar包啟動(dòng)后端,故而準(zhǔn)備打包后的jar文件,需要的朋友可以參考下
    2022-12-12
  • 如何獲取MyBatis Plus執(zhí)行的完整的SQL語(yǔ)句

    如何獲取MyBatis Plus執(zhí)行的完整的SQL語(yǔ)句

    這篇文章主要介紹了如何獲取MyBatis Plus執(zhí)行的完整的SQL語(yǔ)句問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 使用ElasticSearch6.0快速實(shí)現(xiàn)全文搜索功能的示例代碼

    使用ElasticSearch6.0快速實(shí)現(xiàn)全文搜索功能的示例代碼

    本篇文章主要介紹了使用ElasticSearch6.0快速實(shí)現(xiàn)全文搜索功能,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02

最新評(píng)論

桦川县| 介休市| 同仁县| 卢龙县| 定州市| 普兰县| 杭州市| 游戏| 特克斯县| 宝山区| 外汇| 紫阳县| 龙里县| 大庆市| 阜新市| 宝应县| 九龙坡区| 乐山市| 温宿县| 东乡县| 榆社县| 宿松县| 东阳市| 临澧县| 茶陵县| 深州市| 孙吴县| 新民市| 长汀县| 抚松县| 大余县| 丹东市| 汽车| 拜城县| 松桃| 玉门市| 溧水县| 清水河县| 英超| 宜川县| 宜良县|