二叉樹的中序非遞歸遍歷

2020-12-16 一入代碼深似海

二叉樹的中序遍歷順序是左子節點->根節點->右子節點。二叉樹如下圖所示:

1 過程

我們選用棧來存放需要處理的二叉樹節點,出棧順序即二叉樹的遍歷順序。首先要進行棧的初始化,很顯而易見的,如果二叉樹的根節點為空,那麼不需要任意遍歷直接結束;如果二叉樹的根節點不為空,使用current指向當前要處理的元素,此時current代表根節點1,如下圖所示:

入棧規則:首先我們需要獲取棧頂元素current,注意該地方獲取指拿到棧頂元素,並不是將棧頂元素出棧,檢測棧頂是否有左孩子,如果有那麼需要一直將左孩子入棧,直到棧頂的元素不再有左孩子為止,如下圖所示:

出棧規則:此時需要彈出棧頂元素,即將棧頂元素輸出,然後檢測該元素是否有右孩子,如果有右孩子則current指向其右孩子,按入棧規則進行處理。如果沒有右孩子則繼續彈出棧頂。

如上圖所示,此時current代表節點4,4沒有左孩子,打破入棧規則,則將其彈出,4無右孩子則繼續彈出棧頂2,發現其含有右孩子,按入棧規則入棧5,8也需要入棧,如下圖所示:

8無左孩子,打破入棧規則,將其彈出,發現8沒有右孩子,繼續彈出5,5沒有右孩子,繼續彈出1,1有右孩子,按入棧規則,將3入棧,3有左孩子6,繼續入棧6,如下圖所示:

6無左孩子,打破入棧規則,將其彈出,6並無右孩子,繼續彈出3,此時輸出為4->2->8->5->1->6->3

3有右孩子7,將3入棧,按入棧規則檢測3無左孩子,打破入棧規則;此時棧內只有元素7;

將棧頂7彈出,7有右孩子9,打破入棧規則,將9入棧;此時輸出為4->2->8->5->1->6->3->7;棧內有元素9;

將9彈出,9無右孩子,並且此時棧為空,則遍歷結束,輸出為4->2->8->5->1->6->3->7->9。

2 思考

根據棧的使用規則,要區分獲取棧頂元素與彈出棧頂元素的操作不同點,思考如何將遍歷的順序與棧數據結構特點的結合使用。

3 代碼

此處給出二叉樹中序非遞歸遍歷的Java樣例代碼:

4 總結

本文總結了二叉樹中序非遞歸遍歷的算法,其中使用了棧做輔助數據結構,並詳細的繪圖並描述了遍歷過程,對於使用的輔助數據結構棧的操作與中序遍歷的特點進行結合達到效果,最後給出了實現代碼。

相關焦點

  • 二叉樹的所有遍歷非遞歸實現
    前言:二叉樹的遍歷形式有很多,比如前序、中序、後序、層序遍歷,在最近的一次面試中,面試官要求手寫層序遍歷代碼(非遞歸的形式),由此可見遍歷的重要性.本篇博客我們就來看一下二叉樹的幾種遍歷方式.本篇博客語言均採用java實現:目錄:一:二叉樹簡介二:前序遍歷三:中序遍歷
  • 二叉樹的後序非遞歸遍歷
    二叉樹的後序遍歷順序是左子節點->右子節點->根節點。二叉樹如下圖所示:1 過程後序遍歷與前序和中序不同的是:前序遍歷時,不需要檢測是否含有左子樹和右子樹子直接輸出當前節點;中序遍歷只需要查看當前節點是否含有左子樹並處理完畢後才能輸出當前節點;後序遍歷必須要查看左右子樹並且都處理完成後才能輸出,這也是非遞歸遍歷中後序遍歷的難點
  • 二叉樹的前序非遞歸遍歷
    二叉樹的遍歷是二叉樹數據結構的重要操作之一,對於遍歷我們首先想到的就是遞歸,遞歸操作思想簡潔,操作簡單,但是在複雜的高度較大的二叉樹應用中使用遞歸算法,可能會造成性能的浪費,本文來介紹二叉樹的前序非遞歸遍歷。
  • 二叉樹的實現、遍歷及面試題
    二叉樹的遍歷方式有「深度優先遍歷和廣度優先遍歷」兩種思路。深度優先遍歷又分為「先序遍歷、中序遍歷、後序遍歷」三種方式;廣度優先遍歷主要是「層次遍歷」。先序遍歷順序:根、左、右中序遍歷順序:左、根、右後序遍歷順序:左、右、根二叉樹的遍歷如圖所示的二叉樹的遍歷結果分別為:
  • 完整的二叉樹創建、遍歷、高度、葉子節點數的求法(附代碼)
    承接上一篇文章,本文將對二叉樹的創建、遍歷(前中後序遍歷)、樹的高度、樹的葉子節點數的求法進行代碼實現,以C++為例,如果有不懂的可以評論區留言討論。c++實現二叉樹節點類定義節點類定義樹操作類Node* root=0; //保存根節點的類變量void createTree(Node*& node); //創建二叉樹的函數
  • 數據結構學習筆記:樹與樹的表示、二叉樹及其遍歷、二叉搜索樹、平衡二叉樹、堆、哈夫曼樹、集合及其運算
    >二叉樹的存儲結構順序存儲結構依完全二叉樹的形式存儲:按從上到下、從左到右順序存儲。二叉樹的遞歸遍歷先序遍歷:訪問根結點;先序遍歷其左子樹;先序遍歷其右子樹oid PreOrderTraversal(BinTree BT)   {      if(BT)      {          printf("%d", BT->data);          PreOrderTraversal
  • 507,BFS和DFS解二叉樹的層序遍歷 II
    給定一個二叉樹,返回其節點值自底向上的層序遍歷。(即按從葉子節點所在層到根節點所在的層,逐層從左向右遍歷)例如:給定二叉樹 [3,9,20,null,null,15,7],返回其自底向上的層序遍歷為:這題類似於二叉樹的BFS列印,就是一層一層的列印,一般情況下對於二叉樹我們都是從上往下列印,但這題是從下往上列印。
  • 二叉樹的四種遍歷算法實現
    你想要的IT學習資源,這裡全都有點擊上方藍字「輪子工廠」一起玩耍二叉樹的遍歷二叉樹結構public class
  • 二叉樹和分治法
    Outline:二叉樹的遍歷遍歷方法與分治法Maximum Depth of Binary TreeBalanced Binary Tree二叉樹的最大路徑和 (root->leaf)Binary Tree Maximum Path Sum II (
  • File遞歸【遞歸遍歷目錄】
    File文件基本操作:案例需求:給定一個路徑(E:\Hmw),通過遞歸完成遍歷該目錄下所有內容,並把所有文件的絕對路徑輸出在控制臺
  • 二叉樹的應用—二叉樹遍歷的應用
    下面介紹幾個遍歷操作的典型應用。1.查找數據元素Search(bt,x)在bt 為二叉樹的根結點指針的二叉樹中查找數據元素x。查找成功時返回該結點的指針;查找失敗時返回空指針。算法實現如下,注意遍歷算法中的Visite(bt->data)等同於其中的一組操作步驟。
  • 二叉樹遍歷就是這麼簡單(必殺)
    先序遍歷規則:每次優先遍歷根節點,口訣:根左右先序遍歷 遞歸形式void _PreOrder(BinTreeNode *t){ if (t !中序遍歷中序遍歷 遞歸形式這個和前面遞歸形式一樣,不過是換換順序void InOrder(BinTreeNode**
  • 【原創教程】數據結構與算法(1)——二叉樹
    一、二叉樹二叉樹是一種更為典型的樹樹狀結構。
  • 【算法總結】五道常見的算法-二叉樹
    一棵典型的二叉樹如下圖所示:由上述的定義可以看出,二叉樹中的節點至多包含兩棵子樹,分別稱為左子樹和右子樹,而左子樹和右子樹又分別至多包含兩棵子樹。由上述的定義,二叉樹的定義是一種遞歸的定義。遍歷方式二叉樹主要有四種遍歷方式前提:這裡先給出測試中的二叉樹結構,如下圖所示
  • C語言丨不要閱讀此文,除非你已掌握二叉樹的這些操作
    但是最常見的還是相對簡單的二叉樹,二叉樹和常規樹都可以進行相互轉換。所以,二叉樹的操作必不可少。我這裡來簡單介紹一下。 在數據結構中給的樹和圖中,我們最好使用遞歸來進行各種操作,會讓代碼更清晰易懂,代碼也會更簡潔。
  • 實戰LeetCode - 前端面試必備二叉樹算法
    二叉樹簡介二叉樹是一種非常重要的數據結構,很多其它數據結構都是基於二叉樹的基礎演變而來的。對於二叉樹,有深度遍歷和廣度遍歷,深度遍歷有前序、中序以及後序三種遍歷方法,廣度遍歷即我們平常所說的層次遍歷。因為樹的定義本身就是遞歸定義,因此採用遞歸的方法去實現樹的三種遍歷不僅容易理解而且代碼很簡潔,而對於廣度遍歷來說,需要其他數據結構的支撐,比如堆了。
  • 有關樹遍歷的javascript實現【前端-總結-leetcode算法題】
    ,先中後序遍歷(二叉樹)1.1.2 樹的深度優先遍歷(DFS)「儘可能深的搜索樹的分支1、訪問根節點2、對根節點的children挨個進行深度優先遍歷👉 (遞歸)val:3,    left:{      val:6,      left:null,      right:null    },    right:{      val:7,      left:null,      right:null    },  },};1.2.2 二叉樹的先序遍歷遞歸版
  • 二叉樹的鋸齒形層次遍歷
    題目分析103題是leetcode中一道中等難度的題目,這道題目是二叉樹的層次遍歷的變形題。小王同學曾經分析過二叉樹的層次遍歷這道題目,地址在二叉樹的層次遍歷。我們先來看一下這道題目。這道題目和二叉樹的層次遍歷相似,需要我們將遍歷的順序變為「之字形」。接下來我們看一下這道題目的思路。
  • 二叉樹算法大盤點
    ,基本只要接觸算法這一類的都一定會碰到的,所以我打算通過一篇文章,對二叉樹結構的相關算法進行總結匯總,思路和代碼實現相結合,讓你不在懼怕二叉樹。不過因為前中後序的遍歷,遞歸進入的時機應該需要和我的一樣。先序遍歷遍歷根節點,如果根節點為空,返回;否則,遍歷根節點,然後先序遍歷左子樹,再先序遍歷右子樹。
  • 二叉樹的常用算法
    節點訪問的次序,忽略列印行為如果將列印安排在同個數字第一次被訪問時,第一次即先序遍歷第二次即中序遍歷第三次即後序遍歷現二叉樹的先序、中序、後序遍歷,包括遞歸方式和非遞歸方式二叉樹結構定義public static class Node {        public