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

来源:互联网 发布:宿迁网络问政如何投诉 编辑:程序博客网 时间:2024/05/08 01:55
#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;}
1 0
原创粉丝点击