您的位置:首页 > 编程语言 > C语言/C++

二叉树的先序、中序、后序非递归遍历(C++版)

2015-03-06 14:27 351 查看
//输入abd###c#e##

//输入abd#g###c#e##

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

#include <queue>

#include <stack>

#include <iostream>

using namespace std;

typedef struct BiTNode{

char data;

BiTNode *lchild, *rchild;

}BiTNode,*BiTree;

void CreateBiTree(BiTree &T)//建树,按先序顺序输入节点

{

char ch;

scanf("%c",&ch);

if(ch=='#')

{

T=NULL;

return;

}

else

{

T=(BiTree)malloc(sizeof(BiTNode));

if(!T)

exit(1);

T->data=ch;

CreateBiTree(T->lchild);

CreateBiTree(T->rchild);

}

}

void InOrderTraverse(BiTree T)//非递归中序遍历

{

stack<BiTree> Stack;

if(!T)

{

printf("空树!\n");

return;

}

while(T || !Stack.empty())

{

while(T)

{

Stack.push(T);

T=T->lchild;

}

T=Stack.top();

Stack.pop();

printf("%c",T->data);

T=T->rchild;

}

}

void PreOrderTraverse(BiTree T)//非递归先序遍历

{

stack<BiTree> Stack;

if(!T)

{

printf("空树!\n");

return;

}

while(T || !Stack.empty())

{

while(T)

{

Stack.push(T);

printf("%c",T->data);

T=T->lchild;

}

T=Stack.top();

Stack.pop();

T=T->rchild;

}

}

void PostOrderTraverse(BiTree T)//非递归后序遍历,用一个标记标记右子树是否访问过

{

int flag[20]={0};

stack<BiTree> Stack;

if(!T)

{

printf("空树!\n");

return;

}

while(T) //找到第一个没有左子树的节点

{

Stack.push(T);

flag[Stack.size()]=0;

T=T->lchild;

}

while(!Stack.empty())

{

T=Stack.top();

while(T->rchild && flag[Stack.size()]==0) //(向右没走过)向右走

{

flag[Stack.size()]=1; //向右走,并记下标记

T=T->rchild;

while(T)

{

Stack.push(T);

flag[Stack.size()]=0;

T=T->lchild;

}

T=Stack.top();

}

printf("%c",T->data);

Stack.pop();

}

}

int main()

{

//输入abd###c#e##

BiTree T;

CreateBiTree(T);

PreOrderTraverse(T);

printf("\n");

InOrderTraverse(T);

printf("\n");

PostOrderTraverse(T);

printf("\n");

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐