/*二叉树的创建和遍历,有递归和非递归的形式*/
#include <iostream>
#include <stack>
#include <queue>
#include <cstdlib>//used in "malloc"
using namespace std;
//二叉树的节点
typedef struct BitNode{
char data;
struct BitNode *lchild,*rchild;
}BitNode,*BitTree;
int CreateBitTree(BitTree &T){
char data;
scanf("%c",&data);
if(data == '#'){
T = NULL;
}
else{
T = (BitTree)malloc(sizeof(BitNode));
T -> data = data;
CreateBitTree(T -> lchild);
CreateBitTree(T -> rchild);
}
return 0;
}
void Visit(BitTree T){
if(T -> data != '#'){
printf("%c",T->data);
}
}
void PreOrder(BitTree T){
if(T != NULL){
Visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
void PreOrder2(BitTree T){
stack<BitTree> stack;
BitTree p = T;
while(p || !stack.empty()){
if(p != NULL){
stack.push(p);
printf("%c",p->data);
p = p->lchild;
}
else{
p = stack.top();
stack.pop();
p = p->rchild;
}
}
}
void InOrder(BitTree T){
if(T != NULL){
InOrder(T->lchild);
Visit(T);
InOrder(T->rchild);
}
}
void InOrder2(BitTree T){
stack<BitTree> stack;
BitTree p = T;
while(p || !stack.empty()){
if(p != NULL){
stack.push(p);
p = p->lchild;
}
else{
p = stack.top();
printf("%c",p->data);
stack.pop();
p = p->rchild;
}
}
}
void PostOrder(BitTree T){
if(T != NULL){
PostOrder(T->lchild);
PostOrder(T->rchild);
Visit(T);
}
}
void PostOrder2(BitTree T){
stack<BitTree> stack;
BitTree curr = T;//指向当前要检查的节点
BitTree previsited = NULL;//指向前一个被访问的节点
while(curr != NULL || !stack.empty()){
while(curr != NULL){ //一直往走走直到为空
stack.push(curr);
curr = curr->lchild;
}
curr = stack.top();
// 当前节点的右孩子如果为空或者已经被访问,则访问当前节点
if(curr -> rchild == NULL || curr->rchild == previsited){
printf("%c",curr->data);
previsited = curr;
stack.pop();
curr = NULL;
}
else curr = curr->rchild; //否则访问右节点
}
}
void LevelOrder(BitTree T){
BitTree p = T;
queue<BitTree> queue;
queue.push(p);
while(!queue.empty()){
p = queue.front();
printf("%c",p->data);
queue.pop();
if(p->lchild != NULL){
queue.push(p->lchild);
}
if(p->rchild != NULL){
queue.push(p->rchild);
}
}
}
int main()
{
BitTree T;
CreateBitTree(T);
printf("先序遍历:\n");
PreOrder(T);
printf("\n");
printf("先序遍历(非递归):\n");
PreOrder2(T);
printf("\n");
printf("中序遍历:\n");
InOrder(T);
printf("\n");
printf("中序遍历(非递归):\n");
InOrder2(T);
printf("\n");
printf("后序遍历:\n");
PostOrder(T);
printf("\n");
printf("后序遍历(非递归):\n");
PostOrder2(T);
printf("\n");
printf("层次遍历:\n");
LevelOrder(T);
printf("\n");
return 0;
}