1. 程式人生 > >基於棧和佇列實現二叉樹的遍歷

基於棧和佇列實現二叉樹的遍歷

一般我們遍歷二叉樹的時候用的是遞迴,用遞迴實現比較簡單,程式碼如下:
C/C++ code ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 /**************** 基於遞迴實現後序遍歷, *****************/ void PostOrderTraverse(NODE* pRoot) { if (pRoot == NULL) { return; } else { PostOrderTraverse(pRoot->pLeft);
PostOrderTraverse(pRoot->pRight); printf("%c", pRoot->chValue); } return; }

通過改變printf語句的位置便可以實現前序和中序遍歷。

下面我們來看看如何基於棧實現二叉樹的遍歷,可以把二叉樹分為root,left,right三個部分
前序遍歷的次序為root,left,right;
中序遍歷的次序為left,root,right;
後序遍歷的次序為left,right,root;
先討論前序遍歷和中序遍歷,顯然可以通過下面的步驟實現

1.不斷將左子樹入棧,直到左子樹為空
2.不斷出棧,直到出棧元素的右子樹不為空
3.如果棧不為空或當前根結點不為空,重複步驟1和2
前序遍歷是在步驟1中將入棧的樹的根結點輸出,而中序則是在步驟2中將出棧的樹的根結點輸出
程式碼如下:
C/C++ code ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 /**************** 基於棧實現前序和中序遍歷 *****************/
void OrderTraverseByStack(NODE* pRoot) { NODE* Stack[1000];

相關推薦

基於佇列實現

一般我們遍歷二叉樹的時候用的是遞迴,用遞迴實現比較簡單,程式碼如下: C/C++ code ? 1 2 3 4 5 6 7 8 9 10 11 12 13

python 用佇列實現的深度優先(三種)廣度優先

#coding=utf-8 #自定義佇列 class pyqueue(): def __init__(self, size): self.queue = [] self.size = size self.end =

STL實現

nod 數據 blog new friend const turn ace lrn #include<iostream> using namespace std; template<class Type> class BSTree; templat

c++實現層序、前序創建,遞歸非遞歸實現

log ios cst ack ret 出棧 隊列 結點 非遞歸實現 #include <iostream> #include <cstdio> #include <stdio.h> #include <string> #i

c語言使用指標實現

使用指標實現二叉樹的定義,建立,以及前序遍歷,中序遍歷,後續遍歷。 /* 該程式實現了二叉樹的建立,以及樹的遍歷,前序遍歷,中序遍歷,後序遍歷。 */ #include <stdio.h> #include<stdlib.h> #include &

非遞迴實現(前/中/後序)

//基本資料結構 template<class T> struct BinaryTreeNode { T _data; BinaryTreeNode<T>* _left;

非遞迴實現(附c++完整程式碼)

先序、中序和後序遍歷過程:遍歷過程中經過結點的路線一樣,只是訪問各結點的時機不同。 從圖中可以看到,前序遍歷在第一次遇見元素時輸出,中序遍歷在第二次遇見元素時輸出,後序遍歷在第三次遇見元素時輸出。 非遞迴演算法實現的基本思路:使用堆疊 一、前序遍歷 1、遞迴實

資料結構——鏈佇列實現的層次

在二叉樹的遍歷這篇部落格中https://www.cnblogs.com/wkfvawl/p/9901462.html 對於二叉樹的層次遍歷我只是給出了基於C++ STL的程式碼,這裡我使用資料結構的連結串列,構建一個鏈佇列來實現。這也算是我第一次使用鏈佇列來完成某個任務,鏈佇列程式碼還是來自課本,因為之前

演算法(遞迴實現先序中序後續)(非遞迴實現中序先續)

二叉樹遍歷 這兩天抓緊把二叉樹遍歷複習了一遍,遞迴實現還是一如既往地簡潔,迭代版本寫了好久還是隻實現了先序和中序,後續一直沒搞明白,有空了再更新。 遞迴實現 void RecursionBackTree(TreeNode * root) {

利用鏈式佇列實現的層次(C語言)

規則: 判斷樹是否為空,為空則返回; 若不空,從樹的第一層。也就是根節點開始訪問。 從上而下逐層遍歷, 在同一層中,按從左到右的順序對節點逐個訪問。 #include<stdio.h> #include<stdlib.h> t

【資料結構】陣列、連結串列、佇列

陣列 陣列儲存的資料在地址空間上是連續的。 方便資料的查詢,查詢資料的時間複雜度為O(1)。 連結串列 連結串列儲存的資料在地址空間上可連續,可不連續。 連結串列中的每一個節點都

佇列實現的層序

首先定義佇列的結構體和方法。佇列使用二維指標儲存指向樹節點的指標。i,j為指向佇列開頭、結尾元素的遊標。 struct QueueBTree { int i, j; BTreeNode

佇列實現層序

//基本資料結構 template<class T> struct BinaryTreeNode { T _data; BinaryTreeNode<T>* _left;

- 存儲結構

前序遍歷 main inorder esp bottom ive align return c 編程 在《二叉樹的定義和性質》中我們已經認識了二叉樹這種數據結構。我們知道鏈表的每個節點可以有一個後繼,而二叉樹(Binary Tree)的每個節點可以有兩個後繼。比如這樣定義二

算法(深度優先、廣度優先,前序、中序、後序、層次)及Java實現

order new link left 算法 很多 == 都是 off 二叉樹是一種非常重要的數據結構,很多其它數據結構都是基於二叉樹的基礎演變而來的。對於二叉樹,有深度遍歷和廣度遍歷,深度遍歷有前序、中序以及後序三種遍歷方法,廣度遍歷即我們平常所說的層次遍歷。因為樹的定義

python DFSBFS

檢查python 版本 import sys print(sys.version) print(sys.version_info ) mac python 自己寫的資料結構在 Documents/data_structure/python中 Document

(C++實現

二叉樹3種深度優先遍歷(遞迴、非遞迴)、層次遍歷,最簡潔、最好記! #include<iostream> #include<stack> #include<queue> using namespace std; //節點定義 struct Node { c

(迴圈遞迴)

遞迴 1.前序遍歷 void preorder(BinTree *T) { if(T==NULL) return; cout << T->data; preorder(T->left); preorder(T->rig

[] 方法總結--遞迴與非遞迴--純C實現

非遞迴方法: 思路一:根據訪問次序來入棧並輸出 思路二:模擬訪問過程 思路三:使用識別符號mark來記錄已經第幾次訪問該結點 /* @Desc:二叉連結串列 無頭結點 @Vesrion:0.0.1 @Time:20180922建立 */ #include

:前序,中序,後序,層序的遞迴以及非遞迴實現

樹,是一種在實際程式設計中經常遇到的資料結構,它的邏輯很簡單:除根節點之外每個節點都有且只有一個父節點,除葉子節點之外所有節點都有一個或多個子節點。我們說的二叉樹,就是指子節點最多2個的樹。 二叉樹中,最重要的操作就是遍歷。二叉樹的遍歷分為: 1.前序遍歷:先訪問根節點,