首先定义树的结点,创建树,再进行树的遍历的非递归实现
#include<iostream>
#include <stack>
using namespace std;
//树节点定义
typedef struct node
{
struct node *leftChild;
struct node *rightChild;
char data;
}BiTreeNode, *BiTree;
//树的创建
void createBiTree(BiTree &T)
{
char c;
cin >> c;
if('#' == c)
T = NULL;
else
{
T = new BiTreeNode;
T->data = c;
createBiTree(T->leftChild);
createBiTree(T->rightChild);
}
}
//非递归实现先序遍历
void PreOrder(BiTree root)
{
stack<BiTree> stackTree;
while(root!=NULL||!stackTree.empty())
{
while(root!=NULL)
{
cout<<root->data<<" "; //首先根节点输出并入栈,再左孩子入栈,
stackTree.push(root); //直至结点结点左孩子为空
root=root->leftChild;
}
if(!stackTree.empty()) //最左侧结点遍历完,结点依次出栈,找出存在右孩子的结点
{ //并输出该右结点(while循环),直至栈空
root=stackTree.top();
stackTree.pop();
root=root->rightChild;
}
}
}
//非递归实现中序遍历
void MidOrder(BiTree root)
{
stack<BiTree> stackTree;
while(root!=NULL||!stackTree.empty())
{
while (root!=NULL)
{
stackTree.push(root); //首先根节点输出并入栈,再左孩子入栈,
root=root->leftChild; //直至结点结点左孩子为空
}
if(!stackTree.empty())
{
root=stackTree.top();
stackTree.pop(); //栈顶结点出栈并输出(左孩子和根节点)
cout<<root->data<<" ";
root=root->rightChild; //右孩子
}
}
}
//非递归实现二叉树的后序遍历
typedef struct stackTreeNode
{
BiTree treeNode;
int flag; //标志位,0表示左右还有没有遍历(未入栈),2表示左右孩子已遍历(已入栈)
}*pSTree;
int PostOrder(BiTree root)
{
stack<pSTree> stackTree;
pSTree sTree=(pSTree)malloc(sizeof(struct stackTreeNode));
sTree->treeNode=root;
sTree->flag=0;
stackTree.push(sTree); //根节点入栈
while(!stackTree.empty())
{
pSTree tmpNode=stackTree.top();
if (tmpNode->flag==2) //左右孩子已入栈并已出栈,根节点出栈
{
printf("%c ",tmpNode->treeNode->data);
stackTree.pop();
}
else
{
if (tmpNode->treeNode->rightChild) //右孩子不为空,先入栈
{
pSTree sTree=(pSTree)malloc(sizeof(struct stackTreeNode));
sTree->treeNode=tmpNode->treeNode->rightChild;
sTree->flag=0;
stackTree.push(sTree);
}
tmpNode->flag++;
if (tmpNode->treeNode->leftChild) //左孩子不为空,后入栈
{
pSTree sTree=(pSTree)malloc(sizeof(struct stackTreeNode));
sTree->treeNode=tmpNode->treeNode->leftChild;
sTree->flag=0;
stackTree.push(sTree);
}
tmpNode->flag++;
}
}
return 1;
}
//测试
int main()
{
BiTree T;
createBiTree(T);
printf("\n");
printf("二叉树先序遍历非递归实现: ");
PreOrder(T);
printf("\n");
printf("二叉树中序遍历非递归实现: ");
MidOrder(T);
printf("\n");
printf("二叉树后序遍历非递归实现: ");
PostOrder(T);
system("pause");
return 0;
}