您的位置:首页 > 其它

非递归实现二叉树三种遍历

2016-11-16 19:41 323 查看
#include <cstdio>
#include <cstdlib>
#include <stack>
using namespace std;
typedef char ElementType;
typedef struct TreeNode* BinTree;
struct TreeNode
{
ElementType Data;
BinTree lchild;
BinTree rchild;
};
void createBinTree(BinTree &T)
{
char ch;
scanf("%c",&ch);
if(ch == '0')T = NULL;
else
{
if(!(T = (TreeNode*)malloc(sizeof(TreeNode))))return;
T->Data = ch;
createBinTree(T->lchild);
createBinTree(T->rchild);
}
}
//非递归先序
void PreOrderTraversal(BinTree BT)
{
BinTree T;
stack<BinTree> s;
T = BT;
while(T || !s.empty())
{
while(T)
{
s.push(T);
printf("%5c",T->Data);
T = T->lchild;
}
if(!s.empty())
{
T = s.top();
s.pop();
T = T->rchild;
}
}
}
//非递归中序
void InOrderTraversal(BinTree BT)
{
BinTree T;
stack<BinTree> s;
T = BT;
while(T || !s.empty())
{
while(T)
{
s.push(T);
T = T->lchild;
}
if(!s.empty())
{
T = s.top();
s.pop();
printf("%5c",T->Data);
T = T->rchild;
}
}
}
//非递归后序
void PostOrderTraversal(BinTree BT)
{
BinTree T;
T = BT;
stack<BinTree> s;
stack<BinTree> q;
while(T || !s.empty())
{
while(T)
{
s.push(T);
q.push(T);
T = T->rchild;
}
if(!s.empty())
{
T = s.top();
s.pop();
T = T->lchild;
}

}
//逆向输出堆栈Q中的元素
while(!q.empty())
{
T = q.top();
q.pop();
printf("%5c",T->Data);
}
}
int main()
{
BinTree T;
createBinTree(T);
PreOrderTraversal(T);
printf("\n");
InOrderTraversal(T);
printf("\n");
PostOrderTraversal(T);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 非递归