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

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

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

一、二叉樹的三種遍歷方式

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

在這里插入圖片描述

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

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

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

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

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

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

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

 /**
 * 下文中用到的TreeNode類
 */
 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í),說明已經(jīng)遍歷到二叉樹的左下節(jié)點(diǎn)了,這時(shí)前序遍歷應(yīng)該遍歷右子樹了,首先 pop 出已經(jīng)遍歷保存過的父節(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í),說明還有左子節(jié)點(diǎn)存在,將 tempNode 入棧,并且將 tempNode 置為它自己的左子節(jié)點(diǎn)
     *  (和前序遍歷的區(qū)別在于這里遍歷到先不保存到 list 中,出棧的時(shí)候再將其保存到 list 中)
     *  3.2 tempNode == null 時(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.前序遍歷去左子樹,后序遍歷去右子樹
     * @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í)現(xiàn)的文章就介紹到這了,更多相關(guān)Java二叉樹的先序、中序、后序遍歷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

    java中的tostring方法的具體用法

    這篇文章主要介紹了java中的tostring方法的具體用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面我們來一起學(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ī)淼奈恼率荍ava并發(fā)編程的相關(guān)知識(shí),文中對(duì)java同步容器與并發(fā)容器做了非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-09-09
  • 淺談java IO流——四大抽象類

    淺談java IO流——四大抽象類

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

最新評(píng)論

临城县| 武汉市| 通城县| 昌吉市| 许昌市| 花莲市| 景德镇市| 昌平区| 突泉县| 彰武县| 和林格尔县| 新余市| 扬中市| 蚌埠市| 龙江县| 关岭| 云林县| 伊金霍洛旗| 新宁县| 六盘水市| 普格县| 社旗县| 茶陵县| 电白县| 平乐县| 天等县| 禹州市| 永济市| 理塘县| 平泉县| 常宁市| 哈巴河县| 中江县| 诏安县| 且末县| 泌阳县| 朝阳县| 兖州市| 永昌县| 曲阳县| 淮南市|