二叉树的中序遍历非递归算法java_二叉树遍历例题解析

二叉树的中序遍历非递归算法java_二叉树遍历例题解析*非递归算法思想:  (1)设置一个栈S存放所经过的根结点(指针)信息;初始化S; (2)第一次访问到根结点并不访问,而是入栈;  (3)中序遍历它的左子树,左子树遍历结束后,第二次遇到根结点,就将根结点(指针)退栈,并且访问根结点;然后中序遍历它的右子树。 (4)当需要退栈时,如果栈为空则结束。     代码实现:void…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

*非递归算法思想:

   (1)设置一个栈S存放所经过的根结点(指针)信息;初始化S;

  (2)第一次访问到根结点并不访问,而是入栈;

   (3)中序遍历它的左子树,左子树遍历结束后,第二次遇到根结点,就将根结点(指针)退栈,并且访问根结点;然后中序遍历它的右子树。

  (4) 当需要退栈时,如果栈为空则结束。

 

二叉树的中序遍历非递归算法java_二叉树遍历例题解析

 

二叉树的中序遍历非递归算法java_二叉树遍历例题解析

 

二叉树的中序遍历非递归算法java_二叉树遍历例题解析

 

二叉树的中序遍历非递归算法java_二叉树遍历例题解析

 

代码实现:

void Midorder(struct BiTNode *t)      //t为根指针 
{ struct BiTNode *st[maxleng];//定义指针栈
  int top=0;                  //置空栈
  do{            
    while(t)               //根指针t表示的为非空二叉树 
    { if (top==maxleng) exit(OVERFLOW);//栈已满,退出
      st[top++]=t;             //根指针进栈
      t=t->lchild;             //t移向左子树
     }   //循环结束表示以栈顶元素的指向为根结点的二叉树
         //的左子树遍历结束
    if (top)                    //为非空栈   
    { t=st[--top];             //弹出根指针
      printf("%c",t->data);    //访问根结点
      t=t->rchild;             //遍历右子树
     }
   } while(top||t); //父结点未访问,或右子树未遍历
 }

 

 

依照同样的思维,写的先序遍历非递归模式

void Preorder(struct BiTNode * t){
  struct BiTNode * St[MaxSize], *p;
  int top = 0; 			//置空栈
  if (t! = NULL){
	  St[top++] = t;
    while(top){
	   p = St[--top]; printf("%c ", p->data);
	   if(p->rchild != NULL)
	      St[top++] = p->rchild;
	   if(p->lchild != NULL)
	      St[top++] = p->lchild;
    }
    printf("\n");
  }
}

 

后序遍历

void Postorder(struct BiTNode * t){
  struct BiTNode * St[MaxSize], *pre;
  int flag, top = 0;
  if (t != NULL){
	  do{
		 while(t != NULL){
		   St[top++] = t; t = t->lchild;
        }
		 pre = NULL; flag = 1;
		 while(top && flag){
          t = St[top-1];
		   if(t->rchild == pre){
		   	printf(“%c ”, t->data); top--;  pre = t;
		   }
		   else{ t=t->rchild; flag = 0;}
	     }
	   }while(top);
	  printf(“\n”); 
	}
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/193839.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java date 毫秒_如何在几个数字上加上同一个单位

    java date 毫秒_如何在几个数字上加上同一个单位//时间加上秒后的时间日期publicstaticDatetimePastTenSecond(Integersecond,Stringotime){try{SimpleDateFormatsdf=newSimpleDateFormat(“yyyy-MM-ddHH:mm:ss”);Datedt=sdf.parse(otime);CalendarnewTime=Calenda.

    2022年9月6日
  • IOS 地图定位,标记位置,获取经纬度,MKMapView的使用「建议收藏」

    IOS 地图定位,标记位置,获取经纬度,MKMapView的使用「建议收藏」IOS地图定位,标注地图,获取经纬度:一、使用MKMapView定位二、在地图上通过经纬度标注(大头针)项目源码:http://download.csdn.net/detail/swingpyzf/6569785最终效果图:打开应用程序会自动定位并且放大到自己的位置,然后在我的位置上显示自己的经纬度,通过填写经纬度可以放置大头针标

    2022年6月25日
  • SpringBoot集成Redis和配置Redis做缓存[通俗易懂]

    SpringBoot集成Redis和配置Redis做缓存[通俗易懂]Redis介绍Redis是一个开源的、高性能的、基于键值对的缓存与存储系统,通过提供多种键值数据类型来适应不同场景下的缓存与存储需求,直观的存储结构使得通过程序交互十分简单。Redis数据库中所有数据都存储在内存中,由于内存的读写速度远快于硬盘,因此Redis在性能上对比其他基于硬盘存储的数据库有非常明显的优势,而且Redis提供了对持久化的支持,即可以将内存中的数据异步写入到硬盘中,且不影…

    2022年9月22日
  • Server.MapPath详解「建议收藏」

    Server.MapPath详解「建议收藏」语法:Server.Mappath(path)                          //path为你要指定的路径用途:将path指定的虚拟路径转化为实际路径,参数path必须为虚拟路径,否则将出错!范例:1)Server.Mappth(“page.aspx”)      //找出页面page.aspx的实际路径2)Server.Mappth(“/”)     

    2022年7月12日
  • String数组的创建

    String数组的创建string数组的定义有三种写法:String[]arr=newString[10];//创建一个长度为10的String类型数组。Stringarr[]=newString[10];Stringarr[]={“张三”,”李四”};前面两种写法是一样的,可以互换,但是建议使用前者String[]arr因为java是强类型语言,声明…

    2022年6月7日
  • 产品密钥无法激活成功,最后使用visio2013激活软件激活成功。「建议收藏」

    产品密钥无法激活成功,最后使用visio2013激活软件激活成功。「建议收藏」装了visio2013,使用网上搜索的产品密钥,没有一个能够激活成功。最后发现了visio的一个激活软件KMSpico,成功激活。激活成功教程工具KMSpico_setup.exe下载地址:https://pan.baidu.com/s/1wElfmRaufSpQGloLgQC64g提取码:kv2h安装后,从开始->程序->KMSpico->启动KMSpic…

    2022年6月24日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号