先序非递归遍历二叉树,主要是利用了栈的先进后出原理,用一个栈即可实现该算法,下面我们一起来看一下如何来实现吧

目录

先序建立二叉树

先序递归遍历二叉树

先序非递归遍历二叉树


先序建立二叉树

在进行先序非递归遍历之前,我们需要先建立一个二叉树,这里采用先序的方法建立二叉树

void Create(BiTree *t){
    BiTree q;    //树结点
    char s;       //输入的值
    scanf("%c",&s);
    getchar();
    if(s=='#'){       //当建立时某个树没有左孩子或右孩子时,我们输入一个#
        *t=NULL;   
        return;
    }
    q=(BiTree)malloc(sizeof(BiTree));    //分配内存
    q->data=s;
    *t=q;                               //根结点
    Create(&q->lchild);        //先序建立左子树
    Create(&q->rchild);        //先序建立右子树
}

先序递归遍历二叉树

在建立完二叉树后,我们先来看看递归的算法是如何实现的

void xianxu(BiTree t){
    if(!t) return;                     //当树节点为空时,返回
    printf("%c",t->data);       //打印跟结点
    xianxu(t->lchild);            //先序遍历左子树
    xianxu(t->rchild);            //先序遍历右子树
}

先序非递归遍历二叉树

下面我们来看看如何非递归对二叉树进行遍历

void fxianxu(BiTree t){
    BiTree stack[100],p;     //我们需要一个保存树结点的栈
    int top=0;     //栈顶指针
    for(int i=0;i<100;i++){
        stack[i]=0;      //初始化栈
    }
    p=t;           //根结点
    while(p){
        printf("%c",p->data);    //打印根结点
        if(p->rchild){                //先从右边开始,如果右子树不为空
            stack[top++]=p->rchild;      //右子树入栈
        }
        if(p->lchild){               //再看左子树,如果左子树非空
            p=p->lchild;           //继续遍历下一个左子树
        }else if(top>0){          //如果左子树为空但是栈不为空
            p=stack[--top];      //此时栈顶是当前树的右子树,将右子树出栈
        }else{                        //当左子树为空,且栈中没有元素时,遍历结束
            p=0;
        }
    }
}

以上代码理解起来有点抽象,我们举个例子来说明一下:

假设现在我们输入了AB##C##,这是棵最简单的二叉树,A是根结点,B是A的左子树,C是A的右子树,我们用非递归方法对其进行遍历,先看A的右子树,发现它有右子树,右子树是C,C入栈,再看A的左子树,发现它有左子树,左子树为B,我们令B为新的树结点,第一次循环结束,开始第二次循环,我们先看右子树,发现B没有右子树,不做任何操作,再看B的左子树,发现B也没有左子树,但是当前栈中有元素C,我们出栈,并令C为新的树结点,第二次循环结束,执行第三次循环,我们还是先看C的右子树,发现C没有右子树,不做任何操作,再看C的左子树,发现左子树为空,并且当前栈中没有元素,我们令新的树结点为空,即可跳出循环

我们最后来总结一下如何对二叉树进行先序非递归的遍历:

第一步,打印根结点

第二步,先看树结点的右子树,存在,入栈

第三步,再看树结点的左子树,存在,令其为新的树结点,不存在看该树结点右子树是否存在(就是看栈中是否有元素),存在右子树就让右子树为新的树结点继续循环,当某个树结点既没有左子树也没有右子树时结束循环

数据结构专题 | 先序非递归遍历二叉树相关推荐

  1. 数据结构: 中序非递归遍历二叉树

    status InOrderTraverse(BiTree T,status (*visit)(TElementType e) { InitStack(s); p=T; while(p||!Stack ...

  2. 中序非递归遍历二叉树

    二叉树的递归算法虽然简单,但是会导致时间复杂度比较高,下面给大家带来用栈实现的二叉树非递归算法 首先定义好二叉树,和元素类型为二叉树的栈 typedef struct BiTNode{TElemTyp ...

  3. 后序非递归遍历二叉树

    后序遍历的顺序是左.右.根.而前序遍历的顺序是根.左.右.所以只需将前序遍历稍作改变,变成先遍历根再遍历右最后遍历左即(根右左)就会发现此时的顺序便是后序遍历的倒序了,所以这时候只需将改变后的前序遍历 ...

  4. 后序非递归遍历二叉树的应用

    1.打印值为x的结点的所有祖先 栈从0开始,top初始值-1 #include "stdafx.h" #include<iostream> using namespac ...

  5. 二叉树的中序非递归遍历

    二叉树的中序非递归遍历 中序遍历的非递归算法描述如下: 从根节点开始检索,如果当前节点不为空,则将当前节点入栈,让当前节点成为其左孩子节点,再继续上一步的操作 加入当前节点为空了,说明其父节点已经没有 ...

  6. C++实现递归,非递归遍历二叉树(前序,中序,后序)

    初学二叉树那会儿,始终掌握不好二叉树的遍历方法,更认为非递归遍历晦涩难懂没有掌握的意义.实际上非递归的遍历方法很有用处,由于每次递归都需要将函数的信息入栈,当递归层数太深很容易就导致栈溢出,所以这个时 ...

  7. 二叉树中序非递归遍历

    递归是程序设计中强有力的工具.递归函数结构清晰,使程序易读.但递归函数也有不可克服的弱点,时间.空间效率较低,运行代价较高,所以在实际使用中,常希望使用它的迭代版本.为了实现非递归遍历算法,需要一个堆 ...

  8. 数据结构_非递归遍历二叉树(C语言)

    数据结构总目录 非递归遍历二叉树 1. 图文解析 对于链式二叉树,如果要用非递归的方式进行前.中.后序遍历,则需要借助一个栈实现,而层序遍历则需要借助队列来实现. 构建如下二叉树: 非递归先序遍历 ( ...

  9. 二叉树的后序非递归遍历(巧妙思想)

    大家都知道二叉树的前序非递归遍历非常好写: //二叉树的结构 public class TreeNode {TreeNode left;TreeNode right;int val;TreeNode( ...

最新文章

  1. 微软可能是全球最大的开源贡献者,但开发者似乎并不买账​​​​​​​
  2. matlab建模实例运筹学,matlab数学建模实例与编程教程
  3. Android 导航栏如何轻松搞定
  4. vue.js实战——购物车练习(包含全选功能)
  5. python zipfile 乱码_python zipfile文件名乱码问题
  6. ubuntu下pip的安装、升级和使用
  7. python标准库学习5 ---bisect — Array bisection algorithm
  8. python 日志框架_按日期打印Python的Tornado框架中的日志的方法
  9. VB6 如何添加自定义函数 模块 把代码放到一个模块中
  10. 使用IDM下载软件下载百度云网盘里的资源,以Chrome浏览器为例
  11. 三角函数π/2转化_数学集训营 | NO.16 任意角的三角函数之必考点
  12. python绘制国际象棋规则口诀_国际象棋口诀
  13. python实现税后工资_Python扣除个人税后的工资计算器
  14. .NET发邮件(验证码)
  15. 全球裁员潮,Salesforce职业能否抵御风险?
  16. ​UG塑胶模具设计结构分析是如何挤压成型的
  17. 【高质量编程指南笔记】
  18. 软件使用小技巧-Linux疑难杂症
  19. S60v5 GBA模拟器gpSP4Symbian v0.5安装使用图文教程
  20. MATLAB定义大气湍流模型退化函数,基于改进的Kolmogorov谱湍流模型的图像退化研究...

热门文章

  1. 机器学习(概述一)——定义
  2. sklearn聚类之谱聚类SpectralClustering
  3. Qt--编译安装QWT
  4. javascript学习路线图
  5. mint ui tabbar选中后怎么改变icon图标_微信朋友圈怎么转发 微信里面的朋友圈发的怎样再转发一次?...
  6. C24、异常处理程序和软件异常
  7. Autodesk 3ds Max 2013 下载 破解 教程
  8. C#配合zxing的二维码生成器
  9. Java爬虫框架WebMagic
  10. [附源码]Python计算机毕业设计Sketch2Mod网站Django(程序+LW)