二叉树遍历
一、需求分析
分别根据先序、中序、后序、层次遍历二叉树。
二、部分代码
1.创建二叉树(递归思想)
typedef struct BiTNode{
char data;
bool isFirst;
BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
BiTree CreateBiTree(){
char ch;
BiTree T;
cin >> ch;
if(ch=='#')T=NULL;
else{
T=new BiTNode;
T->data = ch;
T->lchild = CreateBiTree();
T->rchild = CreateBiTree();
}
return T;//返回根节点
}
2.先序递归遍历(根-左孩子-右孩子)
void PreOder(BiTree T){
if(T){
cout << T->data;
PreOder(T->lchild);
PreOder(T->rchild);
}
}
3.中序递归遍历(左孩子-根-右孩子)
void InOder(BiTree T){
if(T){
InOder(T->lchild);
cout << T->data;
InOder(T->rchild);
}
}
4.后序递归遍历(左孩子-右孩子-根)
void PostOder(BiTree T){
if(T){
PostOder(T->lchild);
PostOder(T->rchild);
cout << T->data;
}
}
5.用栈实现
void PreOder2(BiTree T){
stack<BiTree> s;
while(T!=NULL||!s.empty()){
while(T!=NULL){
s.push(T);
cout << T->data;
T = T->lchild;
}
if(!s.empty()){
T = s.top();
s.pop();
T = T->rchild;
}
}
}
void InOder2(BiTree T){
stack<BiTree> s;
while(T||!s.empty()){
while(T!=NULL){
s.push(T);
T = T->lchild;
}
if(!s.empty()){
T = s.top();
cout << T->data;
s.pop();
T = T->rchild;
}
}
}
void PostOder2(BiTree T){
stack<BiTree> s;
while(T||!s.empty()){
while(T){
T->isFirst=true;
s.push(T);
T = T->lchild;
}
T = s.top();
s.pop();
if(T->isFirst == true){
T->isFirst=false;
s.push(T);
T = T->rchild;
}
else{
cout << T->data;
T =NULL;
}
}
}
6.层次遍历(队列实现)
void Travers(BiTree T){//层次遍历
queueq;
q.push(T);
while(!q.empty()){
T=q.front();
q.pop();
cout << T->data;
if(T->lchild)
q.push(T->lchild);
if(T->rchild)
q.push(T->rchild);
}
}
本程序借鉴资料与相关代码,不住之处希望指出。