二叉树的前中后序遍历

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define Size 100
#define Resize 10
typedef struct Bitnode{    //定义结点  
    char data;
    struct Bitnode *lchild,*rchild;
}Bitnode,*Bitree;

typedef struct Stack{            //定义栈
    Bitree *base;
    int top;
    int stacksize;
}Stack;

void Initstack(Stack &S)              //建栈
{
    S.base=(Bitree*)malloc(Size*sizeof(Bitnode));
    if(!S.base)    return;
    S.top=0;
    S.stacksize=Size;
}

void Pushstack(Stack &S,Bitree e)                //入栈
{
    if(S.top==S.stacksize)
    {
        S.base=(Bitree*)realloc(S.base,(S.stacksize+Resize)*sizeof(Bitnode));
        if(!S.base)    return;
        S.stacksize+=Resize;
    }
    S.base[S.top++]=e;
}

Bitree Pop(Stack &S,Bitree &e)          //出栈
{
    if(S.top==0)
        return 0;
    e=S.base[--S.top];
    return e;
}

int Emptystack(Stack &S)        //栈的判空操作
{
        if(S.top==0)
            return 1;
        return 0;
}

Bitree Gettop(Stack &S,Bitree &e)          //取栈顶元素
{
    if(S.top==0)
        return 0;
    e=S.base[S.top-1];
    return e;
}

void Createbitree(Bitree &bt)
{
    //建立二叉树的二叉链表
    char ch;
    ch=getchar();
    if(ch==‘#‘)
        bt=NULL;
    else
    {
        bt=(Bitree)malloc(sizeof(Bitnode));
        bt->data=ch;
        bt->lchild=bt->rchild=NULL;
        Createbitree(bt->lchild);
        Createbitree(bt->rchild);
    }
}

void Pretraverse(Bitree bt)
{//递归先序遍历
    if(bt)
    {
        printf("%c ",bt->data);
        Pretraverse(bt->lchild);
        Pretraverse(bt->rchild);
    }
}

void Preordertraverse(Bitree bt)
{//非递归先序遍历
    Stack S;
    Bitree p;
    if(bt)
    {
        Initstack(S);Pushstack(S,bt);
        while(!Emptystack(S))
        {
            while(Gettop(S,p)&&p)
            {
                printf("%c ",p->data);
                Pushstack(S,p->lchild);
            }
            Pop(S,p);
            if(!Emptystack(S))
            {
                Pop(S,p);
                Pushstack(S,p->rchild);
            }
        }
    }
}

void Intraverse(Bitree bt)
{//递归中序遍历
    if(bt)
    {
        Intraverse(bt->lchild);
        printf("%c ",bt->data);
        Intraverse(bt->rchild);
    }
}

void Inordertraverse(Bitree bt)
{//非递归中序遍历
    Stack S;
    Bitree p;
    if(bt)
    {
        Initstack(S); Pushstack(S,bt);
        while(!Emptystack(S))
        {
            while(Gettop(S,p)&&p)
                Pushstack(S,p->lchild);
            Pop(S,p);
            if(!Emptystack(S))
            {
                Pop(S,p);
                printf("%c ",p->data);
                Pushstack(S,p->rchild);
            }
        }
    }
}

void Posttraverse(Bitree bt)
{//递归后序遍历
    if(bt)
    {
        Posttraverse(bt->lchild);
        Posttraverse(bt->rchild);
        printf("%c ",bt->data);
    }
}

void Postordertraverse(Bitree bt)
{//非递归后序遍历
    Bitree p,q;
    Stack S;
    if(bt)
    {
        Initstack(S); Pushstack(S,bt);
        while(!Emptystack(S))
        {
            while(Gettop(S,p)&&p)
                Pushstack(S,p->lchild);
            Pop(S,p);
            if(!Emptystack(S))
            {
                Gettop(S,p);
                if(p->rchild)
                    Pushstack(S,p->rchild);
                else
                {
                    Pop(S,p);
                    printf("%c ",p->data);
                    while(!Emptystack(S)&&Gettop(S,q)&&q->rchild==p)
                    {
                        Pop(S,p);
                        printf("%c ",p->data);
                    }
                    if(!Emptystack(S))
                    {
                        Gettop(S,p);
                        Pushstack(S,p->rchild);
                    }
                }
            }
        }
    }
}
int main()
{
    Bitree bt;
    Createbitree(bt);
    printf("递归先序遍历二叉树:\n");
    Pretraverse(bt);
    printf("\n");
    printf("非递归先序遍历二叉树:\n");
    Preordertraverse(bt);
    printf("\n");
    printf("递归中序遍历二叉树:\n");
    Intraverse(bt);
    printf("\n");
    printf("非递归中序遍历二叉树:\n");
    Inordertraverse(bt);
    printf("\n");
    printf("递归后序遍历二叉树:\n");
    Posttraverse(bt);
    printf("\n");
    printf("非递归后序遍历二叉树:\n");
    Postordertraverse(bt);
    printf("\n");
    return 0;
}

//ABD###CE##F##
时间: 2024-11-05 12:14:18

二叉树的前中后序遍历的相关文章

二叉树的前中后序遍历简单的递归

二叉树的遍历 无外乎广度和深度 其中深度又分为前中后序遍历三种情况  这三种遍历若只是递归方法 自然很是简单 但递归代码简单 若嵌套层次太深 会栈溢出 二叉树节点数据结构: struct Binary_node{    int val;    Binary_node *left;    Binary_node *right;    Binary_node(int v = 0, Binary_node *le = nullptr, Binary_node *ri = nullptr) :val(v

POJ 2255 Tree Recovery &amp;&amp; Ulm Local 1997 Tree Recovery (二叉树的前中后序遍历)

链接:poj.org/problem?id=2255 题意: 分别给你一个二叉树的前序遍历序列和中序遍历序列,让你给出这个二叉树的后序遍历序列. 思路: 对于二叉树的三种遍历方式,都可以使用递归来实现,那么也一定可以使用递归来拆解,以达到从遍历序列确定二叉树具体结构的目的.对于前序遍历来说,第一个字母一定是根,并且在序列中根的左子树包含的点一定出现在根的右子树的前面.对于中序遍历序列来说,根前面出现的字母所代表的点一定出现在左子树中,根后面出现的字母所代表的点一定出现在右子树中.在根据前序与中序

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

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

二叉树的前中后序遍历迭代&amp;广度遍历

递归很是简单 但也应该掌握其迭代方式的遍历方法 这三种的迭代遍历方法需要通过栈来存储节点 尤其是后序遍历还需要 记录当前节点的右子树是否已被遍历 决定是否遍历当前节点 而其广度遍历 只需要一个队列来顺序记录遍历节点 即可轻松解决问题  主要思想在程序代码中来做说明 前序遍历:遍历结果返回一个vector容器中 std::vector<int> BinaryTree::pre_order_iter(Binary_node *root){    std::vector<int> res

Binary Tree Traversal 二叉树的前中后序遍历

[抄题]: [思维问题]: 不会递归.三要素:下定义.拆分问题(eg root-root.left).终止条件 [一句话思路]: [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入): [画图]: [一刷]: [二刷]: [三刷]: [四刷]: [五刷]: [总结]: [复杂度]:Time complexity: O() Space complexity: O() [英文数据结构,为什么不用别的数据结构]: [其他解法]: [Follow Up]: [L

二叉树的前序建立,前中后序遍历的非递归算法

二叉树的前序建立递归算法以及前中后序遍历的递归算法已经是人尽皆知了,递归算法也确实为代码的编写带来了很大的方便.然而,有时我们也确实需要它们的非递归算法.将递归算法转化为非递归算法可以帮助我们深入了解函数的调用与栈的原理.这里总结一下二叉树的这些重要的非递归算法. 一.前序建树 前序建树的基本思路是,接收用户输入的一组字符串,其中'#'代表空树,其他代表树结点的数据域值.例如,要建立如下一棵树 需要输入"AB#D##C##". 而非递归的思路是,1.设一个标志位来判断当前创建的结点是左

栈实现二叉树的先,中,后序遍历

栈实现二叉树先,中,后序遍历 如果是使用递归来实现二叉树的先,中,后序遍历只需要更改三行代码的位置,但若是使用栈来写那便会有趣得多 根结点与其左右子树间的输出优先级 graph TD 1((根结点))---2((左子树)) 1---3((右子树)) 遍历方式 输出优先级 先序 根结点>左子树>右子树 中序 左子树>根结点>右子树 后序 左子树>右子树>根节点 使用栈的规则 栈内元素是指向结点的指针 只有栈顶元素指向的结点内容才会被输出 方便,不用记忆太多结点 结点内容输

非递归前中后序遍历二叉树

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 写在前面: 最近准备找工作,捡起原来学习过的各种知识,加上一些自己的理解,梳理一下流程,巩固自己的认识,一步两步,一步两步... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 二叉树的遍历是树操作的基础,一般的前中后序递归遍历比较简单,这里就不列出了,主要是非递归实

Qt实现 动态化遍历二叉树(前中后层次遍历)

binarytree.h 头文件 1 #ifndef LINKEDBINARYTREE_H 2 #define LINKEDBINARYTREE_H 3 #include<c++/algorithm> 4 #include<c++/cstdio> 5 #include<string> 6 #include<c++/string> 7 #include<c++/vector> 8 #include<vector> 9 #include&