非遞歸遍歷二叉樹實現

一、遞歸

  
    1.藉助棧,實現3種遍歷的非遞歸算法。
    2.層次遍歷是自頂向下、自左至右的遍歷二叉樹中的元素,可以藉助隊列實現。
在這裏插入圖片描述

二、具體實現

#include<stdio.h>
#include<stdlib.h>
#include<stack>
#include<queue>

using namespace std;

typedef char EleType;

typedef struct BiTNode{
    EleType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

//先序遍歷遞歸創建二叉樹
bool createBitTree(BiTree *T){
	EleType data;
	scanf("%c",&data);
	if('#' == data)
		*T = nullptr;
	else{
		(*T) = (BiTree)malloc(sizeof(BiTNode));
		if(!(*T)){
			exit(-1);
		}
		(*T)->data = data;
		createBitTree(&(*T)->lchild);//創建左子樹
		createBitTree(&(*T)->rchild);//創建右子樹
	}
	return true;
}

void visite(EleType data){
	printf("%c",data);
}


//迭代實現
//前序遍歷
void proOrderTraverse(BiTree &T){
	if(T == nullptr)
		return;
	stack<BiTree> m_stack;
	BiTree p = T;

	while(p || !m_stack.empty()){
		if(p != NULL){
			m_stack.push(p);
			visite(p->data);//訪問中間節點
			p = p->lchild;//遍歷左子樹
		}else{
			p = m_stack.top();
			m_stack.pop();
			p = p->rchild;//遍歷右子樹
		}
	}
}

//中序遍歷
void inOrderTraverse(BiTree &T){
	if(T == nullptr)
		return;
	stack<BiTree> m_stack;
	BiTree p = T;
	while(p || !m_stack.empty()){
		if(p != nullptr){
			m_stack.push(p);
			p = p->lchild;
		}else{
			p = m_stack.top();
			m_stack.pop();
			visite(p->data);
			p = p->rchild;
		}
	}
}

//層次遍歷
void levelOrderTraverse(BiTree &T){
	if(T == nullptr)
		return;
	queue<BiTree> m_queue;//使用隊列實現層次遍歷
	BiTree p = T;
	m_queue.push(p);

	while(!m_queue.empty()){
		p = m_queue.front();
		m_queue.pop();

		visite(p->data);
		
		if(p->lchild != nullptr){//左孩子入隊列
			m_queue.push(p->lchild);

		}
		if(p->rchild != nullptr){//右孩子入隊列
			m_queue.push(p->rchild);
		}
	}
}

//ABC##DE#G##F###
int main(){
	BiTree T;
	createBitTree(&T);
	/*proOrderTraverse(T);
	printf("\n");
	inOrderTraverse(T);
	printf("\n");
	postOrderTraverse(T);*/

	//遞歸實現
	proOrderTraverse(T);
	printf("\n");
	inOrderTraverse(T);
	printf("\n");
	levelOrderTraverse(T);

	getchar();
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章