1. 程式人生 > >經典演算法之非遞迴演算法實現二叉樹前、中、後序遍歷

經典演算法之非遞迴演算法實現二叉樹前、中、後序遍歷

/************************
author's email:[email protected]
date:2017.12.24
非遞迴演算法實現二叉樹前、中、後序遍歷
************************/
#include<iostream>
using namespace std;
#define maxsize 100
typedef struct BTNode
{
	char data;
	struct BTNode *lchild;
	struct BTNode *rchild;

}BTNode,*BTree;
BTree createTree();
void preorderNonrecursion(BTNode *p);
void inorderNonrecursion(BTNode *p);
void postorderNonrecursion(BTNode *p);
int main()
{
	BTree ptree;
	ptree = createTree();

	cout << "非遞迴演算法實現二叉樹前序遍歷:";
	preorderNonrecursion(ptree);
	cout << endl;

	cout << "非遞迴演算法實現二叉樹中序遍歷:";
	inorderNonrecursion(ptree);
	cout << endl;


	cout << "非遞迴演算法實現二叉樹後序遍歷:";
	postorderNonrecursion(ptree);
	cout << endl;

	return 0;
}
BTree createTree() 
{
	BTree pA = (BTNode *)malloc(sizeof(BTNode));
	BTree pB = (BTNode *)malloc(sizeof(BTNode));
	BTree pC = (BTNode *)malloc(sizeof(BTNode));
	BTree pD = (BTNode *)malloc(sizeof(BTNode));
	BTree pE = (BTNode *)malloc(sizeof(BTNode));
	BTree pF = (BTNode *)malloc(sizeof(BTNode));
	BTree pG = (BTNode *)malloc(sizeof(BTNode));
	BTree pH = (BTNode *)malloc(sizeof(BTNode));
	BTree pI = (BTNode *)malloc(sizeof(BTNode));


	pA->data = 'A';
	pB->data = 'B';
	pC->data = 'C';
	pD->data = 'D';
	pE->data = 'E';
	pF->data = 'F';
	pG->data = 'G';
	pH->data = 'H';
	pI->data = 'I';

	pA->lchild = pC;
	pA->rchild = pB;
	pC->lchild = pD;
	pC->rchild = pE;
	pB->rchild = pF;
	pB->lchild = NULL;
	pD->lchild = pG;
	pD->rchild = NULL;
	pE->lchild = NULL;
	pE->rchild = pH;
	pF->lchild = pI;
	pF->rchild = NULL;
	pG->lchild = pG->rchild = NULL;
	pH->lchild = pH->rchild = NULL;
	pI->lchild = pI->rchild = NULL;

	return pA;
}
//非遞迴演算法實現二叉樹前序遍歷
void preorderNonrecursion(BTNode *p) 
{
	if (p != NULL) 
	{
		BTNode *Stack[maxsize];
		int top = -1;
		BTNode *q;
		Stack[++top] = p;
		while (top != -1)
		{
			q = Stack[top--];
			cout << q ->data;
			if (q->rchild != NULL)
				Stack[++top] = q->rchild;
			if (q->lchild != NULL)
				Stack[++top] = q->lchild;
		}
	}
}
//非遞迴演算法實現二叉樹中序遍歷
void inorderNonrecursion(BTNode *p) 
{
	if (p != NULL) 
	{
		BTNode *Stack[maxsize];
		int top = -1;
		BTNode *q;
		q = p;
		while (top != -1 || q != NULL)
		{
			while (q!= NULL) 
			{      //左孩子存在,則左孩子進棧
				Stack[++top] = q;
				q = q->lchild;

			}
			if (top != -1) {
				q = Stack[top--];
				cout << q->data;
				q = q->rchild;
			}
		}
	}
}
/*用兩個棧實現非遞迴二叉樹後序遍歷,逆後序遍歷是將前序遍歷過程對左右子樹遍歷順序交換,第二個棧用於把逆後序遍歷變成後序遍歷*/
void postorderNonrecursion(BTNode *p)
{
	if (p != NULL)
	{
		BTNode *Stack1[maxsize];
		int top1 = -1;
		BTNode *Stack2[maxsize];
		int top2 = -1;
		BTNode *q = NULL;
		Stack1[++top1] = p;
		while (top1 != -1)
		{
			q = Stack1[top1--];
			Stack2[++top2] = q;//棧一出棧元素進入棧二
			if (q->lchild != NULL)
				Stack1[++top1] = q->lchild;
			if (q->rchild != NULL)
				Stack1[++top1] = q->rchild;
		}
		while (top2!= -1)
		{
			q = Stack2[top2--];
			cout << q->data;
		}
	}
}

相關推薦

3.1分別用方式實現

題目 用遞迴和非遞迴方式,分別按照二叉樹先序、中序和後序列印所有的節點。 首先給出二叉樹節點結構定義: public class BinaryTreeNode { //二叉樹節點 private int data; private Bi

經典演算法演算法實現

/************************ author's email:[email protected] date:2017.12.24 非遞迴演算法實現二叉樹前、中、後序遍歷 ************************/ #include<

層次建立並用三(C語言)

 先序就是直接用遞迴的方法建立,層次使用了輔助陣列,後一種方法我覺得友好多了。 #include "stdio.h" #define MAXSIZE 50 #define TRUE 1 #define FALSE 0 typedef int boo

數據結構 歸和歸方式實現

nor post 後序遍歷 order else 對象 二叉樹先序 bre print   二叉樹的先序遍歷順序是根、左、右;中序遍歷順序是左、根、右;後序遍歷順序是左、右、根。   遞歸方式實現如下: 1 public class TreeNode { 2

歸和歸方式實現的先

壓入 功能 指南 void 一個 兩個 方法 img oid 很久沒寫博客了,也很久沒有靜下心來學習技術,具體原因不再多糾結。 最近完成零丁任務之余每天刷一刷LeetCode,看看書(比如這篇記錄的是左程雲大佬的《程序員代碼面試指南》中的內容) 溫習和學習一些算法以及相關知

求取的最大/小深度

分層遍歷的思路:二叉樹分層遍歷用到的是BFS(廣度優先搜尋),顯然這必須維護一個佇列。但是一個佇列只能得到遍歷結果,並不能一層一層分開,所以必須使用兩個佇列curr和next,curr儲存當前層的所有結點指標,next儲存下一層的結點指標,遍歷的過程就是出佇列的過程,在對c

方式實現

先序遍歷:中、左、右 中序遍歷:左、中、右 後序遍歷:左、右、中 比如下面這科樹              1         2       3    4    5   6    7 packag

什麼是? 四種是什麼? 2.實現

自從livecoding.tv上線以來,我們很開心看到越來越多直播者加入我們的平臺。為了肯定大家對我們網站的支援和貢獻,我們將從十月份開始,每個月評選出在直播上具有最出色表現的直播者一名,並會送出精美禮品。此外,我們還會在電子信中向我們的訂閱讀者介紹獲獎者。 如果你想成為“

golang簡單實現的數據添加和

package empty pty testin 廣度 golang his 數據 imp 代碼實現 package tree import "fmt" type Node struct { elem interface{}

演算法

在前一篇文章二叉樹遍歷遞迴演算法對二叉樹遍歷的遞迴演算法做了總結,這篇文章就來對二叉樹遍歷的非遞迴演算法做個彙總。還是與上一篇文章一樣的順序,一一彙總先序、中序、後序以及層序遍歷的非遞迴演算法。 1、先序遍歷(非遞迴演算法) 先序遍歷非遞迴訪問,使用棧即可實現。先序遍

全排列演算法Perm演算法實現

題目描述: 給定一個由不同的小寫字母組成的字串,輸出這個字串的所有全排列。 我們假設對於小寫字母有'a' < 'b' < ... < 'y' < 'z',而且給定的字串中的字母已經按照從小到大的順序排列。 輸入: 輸入只有一行,是一個由不同的小寫字母組成的字串,已知字串的長度在1

Fibonacci數列演算法演算法

轉載於:http://blog.csdn.net/qq_33951180/article/details/52484080 一、斐波那契數列  由於斐波納挈數列是以兔子的繁殖引入的,因此也叫“兔子數列”。它指的是這樣一個數列:0,1,1,2,3,5,8,13……從這組數可以很明顯看出這

資料結構實驗-C語言-二叉樹的建立,前、中、後序遍歷遞迴演算法非遞迴演算法,求葉子結點數目,求二叉樹深度,判斷二叉樹是否相似,求二叉樹左右子互換,二叉樹序遍歷演算法,判斷二叉樹是否是完全二叉樹

1.實驗目的 熟練掌握二叉樹的二叉連結串列儲存結構的C語言實現。掌握二叉樹的基本操作-前序、中序、後序遍歷二叉樹的三種方法。瞭解非遞迴遍歷過程中“棧”的作用和狀態,而且能靈活運用遍歷演算法實現二叉樹的其它操作。 2.實驗內容 (1)二叉樹的二叉連結串列的建立 (2)二叉樹的前、中、後

演算法演算法

首先是二叉樹資料結構的定義: typedef struct TNode *Position; typedef Position BinTree; /* 二叉樹型別 */ struct TNode{ /* 樹結點定義 */ int Data; /* 結點資料 */ BinTre

斐波那契數列演算法演算法以及其時間複雜度分析

1、在學習資料結構這門課的過程中,發現斐波那契數列的遞迴演算法以及非遞迴演算法,以及其時間複雜度分析是一個小難點。所以特別總結一下。 斐波那契數列的表示式: Fibonacci數列簡介: F(1)=

《程式設計師的數學》:漢諾塔問題(Hanoi問題)的演算法演算法總結

從被呼叫函式返回呼叫函式前,系統也應完成3件事: ①儲存被呼叫函式的結果; ②釋放被呼叫函式的資料區; ③依照被呼叫函式儲存的返回地址將控制轉移到呼叫函式。 當有多個函式構成巢狀呼叫時,按照“後呼叫先返回”的原則(LIFO),上述函式之間的資訊傳遞和控制轉移必須通過“棧”來實現,即系統將整個程式執行時所需的

斐波那契數列的演算法演算法

一、斐波那契數列 由於斐波納挈數列是以兔子的繁殖引入的,因此也叫“兔子數列”。它指的是這樣一個數列:0,1,1,2,3,5,8,13......從這組數可以很明顯看出這樣一個規律:從第三個數開始,後邊

求最大公約數和最小公倍數(演算法演算法

最近做題目發現一些題目需要求數的最大公約數和最小公倍數,想想最大公約數和最小公倍數平時做數學的時候感覺不是很難,但是突然要程式設計來實現,卻一下子不知所措了,後來看了下別人寫的,發現其實也不算特別難。最小公倍數其實只要一個公式,即整數A和整數B的最小公倍數為A*B/gcd(

的(

#include<stdio.h> #include<stdlib.h> typedef struct node { char data; struct node *lchild,*rchild; }bintnode; typedef struct

演算法題(三十一):搜尋(BST)的序列

題目描述 輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣列的任意兩個數字都互不相同。 分析 後序遍歷序列中,最右邊數字也就是根結點,會把數集分為左右兩部分,左邊數集都小於root,右邊數集都大於root。左