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

Java中二叉樹(shù)的先序、中序、后序遍歷以及代碼實(shí)現(xiàn)

 更新時(shí)間:2023年11月04日 08:31:35   作者:夢(mèng)想不會(huì)滅  
這篇文章主要介紹了Java中二叉樹(shù)的先序、中序、后序遍歷以及代碼實(shí)現(xiàn),一棵二叉樹(shù)是結(jié)點(diǎn)的一個(gè)有限集合,該集合或者為空,或者是由一個(gè)根節(jié)點(diǎn)加上兩棵別稱(chēng)為左子樹(shù)和右子樹(shù)的二叉樹(shù)組成,需要的朋友可以參考下

一、二叉樹(shù)的三種遍歷方式

二叉樹(shù)的遍歷主要有三種:先(根)序遍歷(根左右),中(根)序遍歷(左根右),后(根)序遍歷(左右根),以下圖為例分別說(shuō)明。

在這里插入圖片描述

1、先(根)序遍歷(根左右)

先序遍歷的原則是:先根、再左、再右。 即:ABCDEFGH

2、中(根)序遍歷(左根右)

中序遍歷的原則是:先左、再根、再右。 即:BDCEAFHG

3、后(根)序遍歷(左右根)

后序遍歷的原則是:先左、再右、再根。 即:DECBHGFA

二、代碼實(shí)現(xiàn)二叉樹(shù)的三種遍歷方式

 /**
 * 下文中用到的TreeNode類(lèi)
 */
 class TreeNode {
   int val = 0;
   TreeNode left = null;
   TreeNode right = null;
 }

1、遞歸方式實(shí)現(xiàn)

	/**
     * 先序遍歷的原則是:先根、再左、再右。
     * @param root
     * @param list
     */
    private void preorder(TreeNode root, List<Integer> list){
        if(root != null){
            list.add(root.val);
            preorder(root.left,list);
            preorder(root.right,list);
        }
    }

    /**
     * 中序遍歷的原則是:先左、再根、再右
     * @param root
     * @param list
     */
    private void inorder(TreeNode root, List<Integer> list){
        if(root != null){
            inorder(root.left,list);
            list.add(root.val);
            inorder(root.right,list);
        }
    }

    /**
     * 后序遍歷的原則是:先左、再右、再根
     * @param root
     * @param list
     */
    private void postorder(TreeNode root, List<Integer> list){
        if(root != null){
            postorder(root.left,list);
            postorder(root.right,list);
            list.add(root.val);
        }
    }

2、迭代方式實(shí)現(xiàn)

    /**
     * 先序遍歷的原則是:先根、再左、再右。
     * 1.輔助變量 tempNode 初始化為根節(jié)點(diǎn)
     * 2.當(dāng) tempNode != null 時(shí),就保存這個(gè)節(jié)點(diǎn)值到 list 中,然后將其入棧并置 tempNode為它自己的左子節(jié)點(diǎn)
     * 3.當(dāng) tempNode == null 時(shí),說(shuō)明已經(jīng)遍歷到二叉樹(shù)的左下節(jié)點(diǎn)了,這時(shí)前序遍歷應(yīng)該遍歷右子樹(shù)了,首先 pop 出已經(jīng)遍歷保存過(guò)的父節(jié)點(diǎn),然后置 tempNode 為 pop 出的父節(jié)點(diǎn)的右子節(jié)點(diǎn)
     * @param root
     * @param list
     */
    private void preorder(TreeNode root, List<Integer> list){
        Stack<TreeNode> stack = new Stack<>();
        TreeNode tempNode = root;
        while(!stack.isEmpty() || tempNode != null){
            if (tempNode != null) {
                list.add(tempNode.val);
                stack.push(tempNode);
                tempNode = tempNode.left;
            } else {
                tempNode = stack.pop();
                tempNode = tempNode.right;
            }
        }
    }

    /**
     * 中序遍歷的原則是:先左、再根、再右
     * 1.輔助變量 tempNode 初始化 root
     * 3.當(dāng)棧非空或 tempNode 非 null 時(shí),循環(huán)
     *  3.1 tempNode != null 時(shí),說(shuō)明還有左子節(jié)點(diǎn)存在,將 tempNode 入棧,并且將 tempNode 置為它自己的左子節(jié)點(diǎn)
     *  (和前序遍歷的區(qū)別在于這里遍歷到先不保存到 list 中,出棧的時(shí)候再將其保存到 list 中)
     *  3.2 tempNode == null 時(shí),說(shuō)明到二叉樹(shù)左下的節(jié)點(diǎn)了,這時(shí)棧頂?shù)母腹?jié)點(diǎn)出棧賦值給 tempNode ,并保存節(jié)點(diǎn)值到 list ,將 tempNode 置為棧頂節(jié)點(diǎn)的右子節(jié)點(diǎn)繼續(xù)循環(huán)
     * @param root
     * @param list
     */
    private void inorder(TreeNode root, List<Integer> list){
        Stack<TreeNode> stack = new Stack<>();
        TreeNode tempNode = root;
        while(!stack.isEmpty() || tempNode != null){
            if (tempNode != null) {
                stack.push(tempNode);
                tempNode = tempNode.left;
            } else {
                tempNode = stack.pop();
                list.add(tempNode.val);
                tempNode = tempNode.right;
            }
        }
    }

    /**
     * 后序遍歷的原則是:先左、再右、再根
     * 1.對(duì)應(yīng)前序遍歷的反操作:
     * 2.前序遍歷從尾部添加元素,后序遍歷從頭部添加元素
     * 3.前序遍歷去左子樹(shù),后序遍歷去右子樹(shù)
     * @param root
     * @param list
     */
    private void postorder(TreeNode root, List<Integer> list){
        Stack<TreeNode> stack = new Stack<>();
        TreeNode tempNode = root;
        while (!stack.isEmpty() || tempNode != null) {
            if (tempNode != null) {
                stack.push(tempNode);
                list.add(0, tempNode.val);
                tempNode = tempNode.right;
            } else {
                tempNode = stack.pop();
                tempNode = tempNode.left;
            }
        }
    }

到此這篇關(guān)于Java中二叉樹(shù)的先序、中序、后序遍歷以及代碼實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java二叉樹(shù)的先序、中序、后序遍歷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java單例五種實(shí)現(xiàn)模式解析

    java單例五種實(shí)現(xiàn)模式解析

    這篇文章主要介紹了java單例五種實(shí)現(xiàn)模式解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • JAVA中的deflate壓縮實(shí)現(xiàn)方法

    JAVA中的deflate壓縮實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇JAVA中的deflate壓縮實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • SpringBoot整合mybatis-generator-maven-plugin的方法

    SpringBoot整合mybatis-generator-maven-plugin的方法

    這篇文章主要介紹了SpringBoot整合mybatis-generator-maven-plugin,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • java判斷中文字符串長(zhǎng)度的簡(jiǎn)單實(shí)例

    java判斷中文字符串長(zhǎng)度的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)?lái)一篇java判斷中文字符串長(zhǎng)度的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • 深入淺出講解Java比較器及數(shù)學(xué)常用類(lèi)

    深入淺出講解Java比較器及數(shù)學(xué)常用類(lèi)

    這篇文章主要介紹了深入淺出講解Java比較器及數(shù)學(xué)常用類(lèi),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • java中的tostring方法的具體用法

    java中的tostring方法的具體用法

    這篇文章主要介紹了java中的tostring方法的具體用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面我們來(lái)一起學(xué)習(xí)一下吧
    2019-06-06
  • java合并多個(gè)文件的實(shí)例代碼

    java合并多個(gè)文件的實(shí)例代碼

    在本篇文章里小編給大家整理的是關(guān)于java合并多個(gè)文件的實(shí)例代碼,有需要的朋友們可以參考學(xué)習(xí)下。
    2020-02-02
  • Java ThreadLocal用法實(shí)例詳解

    Java ThreadLocal用法實(shí)例詳解

    這篇文章主要介紹了Java ThreadLocal用法,結(jié)合實(shí)例形式詳細(xì)分析了ThreadLocal線程局部變量相關(guān)原理、定義與使用方法,需要的朋友可以參考下
    2019-09-09
  • JAVA 并發(fā)容器的一些易出錯(cuò)點(diǎn)你知道嗎

    JAVA 并發(fā)容器的一些易出錯(cuò)點(diǎn)你知道嗎

    今天給大家?guī)?lái)的文章是Java并發(fā)編程的相關(guān)知識(shí),文中對(duì)java同步容器與并發(fā)容器做了非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-09-09
  • 淺談java IO流——四大抽象類(lèi)

    淺談java IO流——四大抽象類(lèi)

    這篇文章主要介紹了java IO流——四大抽象類(lèi),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評(píng)論

静宁县| 吐鲁番市| 赤水市| 黄山市| 江达县| 黑山县| 漠河县| 梅河口市| 奉新县| 长岭县| 台安县| 南涧| 玉树县| 鹤岗市| 山阳县| 济源市| 故城县| 弥勒县| 柳林县| 六盘水市| 铜陵市| 扎鲁特旗| 花莲市| 咸阳市| 常熟市| 大理市| 南阳市| 甘泉县| 龙胜| 凤庆县| 黄大仙区| 波密县| 萨嘎县| 铜鼓县| 横山县| 漾濞| 四平市| 云和县| 芜湖县| 伊川县| 兴宁市|