DS二叉树--后序遍历非递归算法

题目描述

求一颗树的后序遍历的非递归算法

要求:必须是非递归算法,使用堆栈对象来实现

建树方法采用“先序遍历+空树用0表示”的方法

算法流程:

输入

第一行输入一个整数t,表示有t个测试数据

第二行起输入二叉树先序遍历的结果,空树用字符‘0’表示,输入t行

输出

逐行输出每个二叉树的后序遍历结果

样例输入

3 AB0C00D00 ABC00D00EF000 ABCD0000E0F00

样例输出

CBDA CDBFEA DCBFEA

提示

#include<iostream>
#include<stack>
using namespace std;
class CNode
{
public:
    char data;
    CNode *left;
    CNode *right;
    CNode()
    {
        left=right=NULL;
    }
};

class BiTree
{
public:
    CNode *Root;
    int pos;
    string strTree;
    BiTree(string str)
    {
        pos=0;
        strTree=str;
        Root=CreateBiTree();
    }
    CNode *CreateBiTree()
    {
        CNode *T;
        char ch;
        ch=strTree[pos];
        pos++;
        if(ch==‘0‘)
        {
            T=NULL;
        }
        else
        {
            T=new CNode();
            T->data=ch;
            T->left=CreateBiTree();
            T->right=CreateBiTree();
        }
        return T;
    }
    void nonPre()
    {
        CNode *T=Root;
        stack<CNode*>S;
        while(T||!S.empty())
        {
            while(T)
            {
                cout<<T->data;
                S.push(T);
                T=T->left;
            }
            if(!S.empty())
            {
                T=S.top();
                S.pop();
                T=T->right;
            }
        }
    }
    void nonPost()
    {
        int tag;///0不可访问,1可访问
        stack<CNode*>S1;///结点
        stack<int>S2;///tag
        CNode *T=Root;
        if(Root==NULL)
            return;
        CNode *p=T;
        do
        {
            while(p!=NULL)
            {
                S1.push(p);
                S2.push(0);
                p=p->left;
            }
            if(S1.empty())
                break;
            if(p==NULL)
            {
                tag=S2.top();
                if(tag==0)
                {
                    tag=1;
                    S2.pop();
                    S2.push(tag);
                    p=S1.top()->right;
                }
                else if(tag==1)
                {
                    p=S1.top();
                    S1.pop();
                    S2.pop();
                    cout<<p->data;
                    p=NULL;
                }
            }
        }while(!S1.empty());
    }
};

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        string str;
        cin>>str;
        BiTree tree(str);
        tree.nonPost();
        cout<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/SZU-DS-wys/p/12183096.html

时间: 2024-08-01 22:55:56

DS二叉树--后序遍历非递归算法的相关文章

二叉树后序遍历的非递归算法(C语言)

首先非常感谢‘hicjiajia’的博文:二叉树后序遍历(非递归) 这篇随笔开启我的博客进程,成为万千程序员中的一员,坚持走到更远! 折磨了我一下午的后序遍历中午得到解决,关键在于标记右子树是否被访问过,考虑过修改二叉树结点的数据结构,增加一个visit域,或者建一个栈存储已访问的结点.都比较麻烦没有调试成功.若将右子树也入栈,如果没有访问标记的话,会改变访问的次序,甚至出现死循环,这是比较危险的情况.从借鉴的博文里,摘录并改写为C的代码,基本上没有改动.后续问题努力写出自己的原创代码. 二叉树

二叉树三种遍历非递归算法

http://blog.csdn.net/pipisorry/article/details/37353037 c实现: 1.先序遍历非递归算法 #define maxsize 100 typedef struct { Bitree Elem[maxsize]; int top; } SqStack; void PreOrderUnrec(Bitree t) { SqStack s; StackInit(s); p=t; while (p!=null || !StackEmpty(s)) { w

二叉树先序、中序、后序遍历的递归算法和非递归算法

先序遍历:若二叉树为空,则空操作:否则访问根节点:先序遍历左子树:先序遍历右子树. 中序遍历:若二叉树为空,则空操作:否则中序遍历左子树:访问根节点:中序遍历右子树. 后序遍历:若二叉树为空,则空操作:否则后序遍历左子树:后序遍历右子树:访问根节点. 二叉链表:链表中的结点包含三个域:数据域和左右指针域. 三叉链表:在二叉链表的基础上增加指向双亲结点的指针域. 以下代码均使用二叉链表. //二叉树的二叉链表存储表示 typedef char TElemType; typedef struct B

二叉树前序、中序、后序遍历非递归写法的透彻解析

前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历.递归写法,只要理解思想,几行代码.可是非递归写法却很不容易.这里特地总结下,透彻解析它们的非递归写法.其中,中序遍历的非递归写法最简单,后序遍历最难.我们的讨论基础是这样的: //Binary Tree Node typedef struct node { int data; struct node* lchild; //左孩子 struct node* rchild; //右孩子 }BTNode; 首先,有一点是明确的:非递归

二叉树的中序、先序、后序遍历非递归遍历算法(使用堆栈,用循环实现)

1 typedef struct TreeNode *BinTree; 2 typedef BinTree Position; 3 struct TreeNode{ 4 ElementType Data; 5 BinTree Left; 6 BinTree Right; 7 }; 8 BinTree BT; 9 void InOrderTraversal(BinTree BT)//中序遍历非递归遍历算法(使用堆栈,用循环实现) 10 { 11 BinTree T=BT; 12 Stack S=C

数据结构之 二叉树---求二叉树后序遍历和层次遍历(先建树,再遍历)

数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历. 输入 输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据.每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列. 输出 每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列 示例输入 2 abdegcf dbgeaf

数据结构实验之求二叉树后序遍历和层次遍历

数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历. 输入 输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据.每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列. 输出 每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列 示例输入 2

前序中序后序遍历非递归实现

#include<iostream> #include<vector> #include<stack> #include<string> #include<algorithm> #include<numeric> using namespace std; class node{ public: int val; node* left; node* right; node():val(0),left(NULL),right(NULL){

二叉树系列 - 二叉树的前/中/后序遍历(非递归)

二叉树的遍历是二叉树中最最基础的部分. 这里整理二叉树不用递归实现三种顺序遍历的方式. 不用递归的话,一般需要栈来完成.当然线索二叉树(不需要栈或递归)也可以完成中序遍历,这种方式在这篇文章中已经讨论过.这里着重讨论使用栈的实现方式. 中序遍历 (1) 双while,第二个内层while是为了不断压入left child. vector<int> inorderTraversal(TreeNode *root) { vector<int> v; if(!root) return v