一、递归
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;
}