• 二叉树--非递归实现


    #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<<"
    ************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<<"
    **************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;
    }
  • 相关阅读:
    A Bug's Life POJ 2492
    First Training
    洛谷----P1162 填涂颜色
    软考知识点梳理--软件测试
    软考知识点梳理--面向对象方法
    软考知识点梳理--国家信息化体系六要素
    软考知识点梳理--电子政务
    软考知识点梳理--激励理论
    软考知识点梳理--承建方项目论证
    软考知识点梳理--项目成本类型
  • 原文地址:https://www.cnblogs.com/luoyaqi/p/5161783.html
Copyright © 2020-2023  润新知