非递归遍历二叉树实现

一、递归

  
    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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章