码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树--非递归实现

时间:2016-01-26 23:38:03      阅读:393      评论:0      收藏:0      [点我收藏+]

标签:

#include<iostream>
#include<stack>
#include<stdio.h>
#include<stdlib.h>
#define ElemType char
using namespace std;

typedef struct BiTNode{
    ElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

int createBiTree(BiTree *t)
{
    char ch;
    ch = getchar();
    if(ch== )
        (*t) = NULL;
    else
    {
        (*t) = (BiTNode*)malloc(sizeof(BiTNode));
        if(!(*t))
            return 0;
        (*t)->data = ch;
        createBiTree(&(*t)->lchild);
        createBiTree(&(*t)->rchild);
    }
    return 1;
}

void preOrderDisplay(BiTree t)
{
    cout<<"*************preOrderDisplay***********"<<endl;
    stack<BiTree> s;
    if(!t)
    {
        cout<<"empty tree"<<endl;
        return;
    }
    s.push(t);
    while(!s.empty())
    {
        BiTree tmp = s.top();
        cout<<tmp->data;
        s.pop();
        if(tmp->rchild!=NULL)
            s.push(tmp->rchild);
        if(tmp->lchild!=NULL)
            s.push(tmp->lchild);
    }
    
}

void inOrderDisplay(BiTree t)
{
    cout<<"\n************inOrderDisplay************"<<endl;
    if(!t)
    {
        cout<<"empty tree"<<endl;
        return;
    }
    stack<BiTree> s;
    BiTree curr = t; 
    
    while(curr!=NULL||!s.empty())
    {
        while(curr!=NULL) // 把节点的左子节点全部入栈
        {
            s.push(curr);
            curr = curr->lchild;
        }
        
        // 然后边出栈边输出边入右节点
        if(!s.empty())
        {
            BiTree tmp = s.top();
            cout<<tmp->data;
            s.pop();
            curr = tmp->rchild;
        }
    }    
    
}

void postOrderDisplay(BiTree t)
{
    cout<<"\n**************postOrderDisplay**************"<<endl;
    if(!t)
        return;
    stack<BiTree> s;
    BiTree curr = t;
    BiTree pre = NULL;

    while(curr!=NULL||!s.empty())
    {
        while(curr!=NULL) // 先左节点全部入栈
        {
            s.push(curr);
            curr = curr->lchild;
        }

        curr = s.top();  
        if(curr->rchild == NULL||curr->rchild == pre) // 判断当前节点是否有右孩子或者当前节点的右孩子是否等于上次访问节点
        {
            cout<<curr->data;
            s.pop();
            pre = curr;
            curr = NULL;
        }    
        else // 有右孩子,需要入栈
            curr = curr->rchild;
    }
}

int main()
{
    BiTree t;
    int creRes = createBiTree(&t);
    cout<<"*******state of creating bitree : "<<creRes<<endl;
    preOrderDisplay(t);
    inOrderDisplay(t);
    postOrderDisplay(t);
    return 1;
}

 

二叉树--非递归实现

标签:

原文地址:http://www.cnblogs.com/luoyaqi/p/5161783.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!