非递归遍历二叉树

#include <stack>
#include <stdio.h>
#include <malloc.h>
#include <iostream>
using namespace std;

typedef struct node
{
    int flag;
    char value;
    struct node *lchild;
    struct node *rchild;
}Node, *PNode;

void CreateBinaryTree(PNode &root)                   /* 前序遍历的递归方式动态建立二叉树 */
{
    char ch;
    scanf("\n%c", &ch);
    if(ch == '#') {root = NULL; return ;}
    root = (Node *)malloc(sizeof(Node));
    root->flag = 0;                                  // flag==0 ---> 第一次经过:父节点-->自身-->左孩子
                                                     // flag==1 ---> 第二次经过:左孩子-->自身-->右孩子
                                                     // flag==2 ---> 第三次经过:右节点-->自身-->父节点
    root->value = ch;
    CreateBinaryTree(root->lchild);
    CreateBinaryTree(root->rchild);
}
void visit(PNode &pointer)
{
    printf("%c ", pointer->value);
}
void OrderTraversal(PNode &root)                     /* 调整visit(temp)出现位置实现前中后序遍历 */
{
    stack<Node> ss;
    PNode temp = root;

    while(!ss.empty() || temp->flag!=2               /* while内部:if --- else if --- else 结构 */
    {
        if(temp->flag == 0)
        {
            visit(temp);                             // PreorderTraversal
            if(temp->lchild != NULL)
            {
                temp->flag = 1;
                ss.push(*temp);
                temp = temp->lchild;
            }
            else
            {
                //visit(temp);                       // InorderTraversal / PostorderTraversal
                temp = &(ss.top());
                ss.pop();
            }
        }
        else if(temp->flag == 1)
        {
            //visit(temp);                           // InorderTraversal
            temp->flag = 2;
            ss.push(*temp);
            temp = temp->rchild;
        }
        else
        {
            //visit(temp);                           // PostorderTraversal
            temp = &(ss.top());
            ss.pop();
        }
    }
    //visit(temp);                                   // PostorderTraversal
}
int main()
{
    cout << "Input element in preorder:" << endl;
    PNode root;
    CreateBinaryTree(root);
    OrderTraversal(root);
    return 0;
}

 

posted on 2015-08-16 22:54  huashunli  阅读(142)  评论(0编辑  收藏  举报

导航