数据结构例程——二叉树遍历的非递归算法

本文是数据结构基础系列(6):树和二叉树中第11课时二叉树遍历非递归算法的例程。

【二叉树遍历的非递归算法】
实现二叉树的先序、中序、后序遍历的非递归算法,并对用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”创建的二叉树进行测试。
请利用二叉树算法库

[参考解答](btreee.h见算法库

#include <stdio.h>
#include "btree.h"

void PreOrder1(BTNode *b)
{
    BTNode *St[MaxSize],*p;
    int top=-1;
    if (b!=NULL)
    {
        top++;                      //根节点入栈
        St[top]=b;
        while (top>-1)              //栈不为空时循环
        {
            p=St[top];              //退栈并访问该节点
            top--;
            printf("%c ",p->data);
            if (p->rchild!=NULL)    //右孩子入栈
            {
                top++;
                St[top]=p->rchild;
            }
            if (p->lchild!=NULL)    //左孩子入栈
            {
                top++;
                St[top]=p->lchild;
            }
        }
        printf("\n");
    }
}

void InOrder1(BTNode *b)
{
    BTNode *St[MaxSize],*p;
    int top=-1;
    if (b!=NULL)
    {
        p=b;
        while (top>-1 || p!=NULL)
        {
            while (p!=NULL)
            {
                top++;
                St[top]=p;
                p=p->lchild;
            }
            if (top>-1)
            {
                p=St[top];
                top--;
                printf("%c ",p->data);
                p=p->rchild;
            }
        }
        printf("\n");
    }
}

void PostOrder1(BTNode *b)
{
    BTNode *St[MaxSize];
    BTNode *p;
    int flag,top=-1;                        //栈指针置初值
    if (b!=NULL)
    {
        do
        {
            while (b!=NULL)                 //将t的所有左节点入栈
            {
                top++;
                St[top]=b;
                b=b->lchild;
            }
            p=NULL;                         //p指向当前节点的前一个已访问的节点
            flag=1;
            while (top!=-1 && flag)
            {
                b=St[top];                  //取出当前的栈顶元素
                if (b->rchild==p)           //右子树不存在或已被访问,访问之
                {
                    printf("%c ",b->data);  //访问*b节点
                    top--;
                    p=b;                    //p指向则被访问的节点
                }
                else
                {
                    b=b->rchild;            //t指向右子树
                    flag=0;
                }
            }
        }
        while (top!=-1);
        printf("\n");
    }
}

int main()
{
    BTNode *b;
    CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
    printf("二叉树b: ");
    DispBTNode(b);
    printf("\n");
    printf("先序遍历序列:\n");
    PreOrder1(b);
    printf("中序遍历序列:\n");
    InOrder1(b);
    printf("后序遍历序列:\n");
    PostOrder1(b);
    DestroyBTNode(b);
    return 0;
}

注:在main函数中,创建的用于测试的二叉树如下——

时间: 2024-10-27 21:52:30

数据结构例程——二叉树遍历的非递归算法的相关文章

数据结构例程——二叉树遍历的递归算法

本文是数据结构基础系列(6):树和二叉树中第10课时二叉树的遍历的例程. [二叉树遍历的递归算法] 实现二叉树的先序.中序.后序遍历的递归算法,并对用"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"创建的二叉树进行测试. 请利用二叉树算法库. [参考解答](btreee.h见算法库) #include <stdio.h> #include "btree.h" void PreOrder(BTNode *b) //先序遍历的递

数据结构 算法-这个程序是二叉树的先序遍历的非递归算法,请问哪里错了????急求

问题描述 这个程序是二叉树的先序遍历的非递归算法,请问哪里错了????急求 #include using namespace std; //================================= struct BiTNode { char data; BiTNode *lchild,*rchild; }; //===================================== struct SNode { BiTNode *Sdata; SNode *next; }; SNo

二叉树先序遍历的非递归算法具体实现

 这篇文章主要介绍了二叉树先序遍历的非递归算法,有需要的朋友可以参考一下 在前面一文,说过二叉树的递归遍历算法(二叉树先根(先序)遍历的改进),此文主要讲二叉树的非递归算法,采用栈结构   总结先根遍历得到的非递归算法思想如下:   1)入栈,主要是先头结点入栈,然后visit此结点   2)while,循环遍历当前结点,直至左孩子没有结点   3)if结点的右孩子为真,转入1)继续遍历,否则退出当前结点转入父母结点遍历转入1)   先看符合此思想的算法:     复制代码 代码如下: int

数据结构关于二叉树遍历的一道题 在线等~

问题描述 数据结构关于二叉树遍历的一道题 在线等~ 利用栈的基本操作写出先序遍历二叉树的非递归算法 要求进栈的元素最少, 并指出下列二叉树中需进栈的元素. 这是答案: 根据上述代码, (1)左子树lchild不需要入栈吗? (2)入栈顺序是什么? (3)最后一行代码 if (top>0) bt=s[top--] 是什么意思? (4)如果是中序或后序,入栈顺序又是什么? 谢谢大神们啦~~ O(∩_∩)O 解决方案 3 if (top>0) bt=s[top--] 出栈.取出top位置的元素,并且

二叉树先序遍历的非递归算法具体实现_javascript技巧

在前面一文,说过二叉树的递归遍历算法(二叉树先根(先序)遍历的改进),此文主要讲二叉树的非递归算法,采用栈结构 总结先根遍历得到的非递归算法思想如下: 1)入栈,主要是先头结点入栈,然后visit此结点 2)while,循环遍历当前结点,直至左孩子没有结点 3)if结点的右孩子为真,转入1)继续遍历,否则退出当前结点转入父母结点遍历转入1) 先看符合此思想的算法: 复制代码 代码如下: int PreOrderTraverseNonRecursiveEx(const BiTree &T, int

数据结构例程——二叉树的层次遍历算法

本文是数据结构基础系列(6):树和二叉树中第12课时层次遍历算法的例程. [二叉树的层次遍历算法] 实现二叉树的层次遍历算法,并对用"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"创建的二叉树进行测试. 请利用二叉树算法库. [参考解答](btreee.h见算法库) #include <stdio.h> #include "btree.h" void LevelOrder(BTNode *b) { BTNode *p; BT

二叉树前序遍历的非递归算法_C 语言

二叉树的前序遍历是先根节点,然后如果有左子树则再先序遍历左子树,然后如果有右子树则再先序遍历其又子树.递归算法如下 复制代码 代码如下:  void   preorder(Betree *t){   if(t==null) return;visit(t);//访问该节点preorder(t->lchild);preorder(t->rchild); } 当然递归算法是隐式使用了栈.我们仔细分析这个过程,先是取出了根节点进行了访问,然后我们把根节点退栈,退栈后必然有节点进栈,怎么办呢?根节点只能

数据结构例程——二叉树的构造

本文是数据结构基础系列(6):树和二叉树中第13课时二叉树的构造的例程. 1.由先序序列和中序序列构造二叉树 定理:任何n(n≥0)个不同节点的二叉树,都可由它的中序序列和先序序列唯一地确定. 证明(数学归纳法) 基础:当n=0时,二叉树为空,结论正确. 假设:设节点数小于n的任何二叉树,都可以由其先序序列和中序序列唯一地确定. 归纳:已知某棵二叉树具有n(n>0)个不同节点,其先序序列是a0a1-an−1:中序序列是b0b1-bk−1bkbk+1-bn−1. 先序遍历"根-左-右&quo

举例讲解C语言程序中对二叉树数据结构的各种遍历方式_C 语言

二叉树遍历的基本思想 二叉树的遍历本质上其实就是入栈出栈的问题,递归算法简单且容易理解,但是效率始终是个问题.非递归算法可以清楚的知道每步实现的细节,但是乍一看不想递归算法那么好理解,各有各的好处吧.接下来根据下图讲讲树的遍历. 1.先序遍历:先序遍历是先输出根节点,再输出左子树,最后输出右子树.上图的先序遍历结果就是:ABCDEF  2.中序遍历:中序遍历是先输出左子树,再输出根节点,最后输出右子树.上图的中序遍历结果就是:CBDAEF 3.后序遍历:后序遍历是先输出左子树,再输出右子树,最后