一、遞歸
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;
}