二叉树的遍历(非递归)整理
二叉树的遍历(非递归)
写在前面
二叉树重要,重要,重要。以下代码每日手撸一遍,深刻理解。
二叉树的先序遍历(非递归)
巧记心法
- 判断是否为空树
- 1、右侧入栈(访问,q指向右孩子,不空则入栈)
- 2、p指向左孩子,为空则弹栈
#define MAX_NODE 50;
void preorderTraverse(BTNode *T){BTNode *stack[MAX_NODE],*p=T,*q;
int top=0;
if(T==NULL){printf("Empty");
}
else{do{visit(p->data);q=p->Rchild;if(q!=null){//入栈stack[++top]=q;}p=p->Lchild;if(p==NULL){//弹栈p=stack[top];top--;}}while(p!=NULL);
}
}
二叉树的中序遍历(非递归)
巧记心法
- 判断是否为空树
- 1、左侧全部入栈
- 2、当全部出栈时(top=0),设置循环结束标志(bool=0)
- 3、否则出栈,访问,p指向右孩子
#define MAX_NODE 50;
void InorderTraverse(BTNode *T){BTNode *stack[MAX_NODE],*p=T;
int bool=1,top=0;
if(T==NULL)printf("Empty");
else{do{while(p!=NULL){//左侧全部入栈stack[++top]=p;p=p->Lchild;}if(top==0) bool=0;else{p=stack[top];top--;visit(p->data);p=p->Rchild;}}while(bool!=0);
}
}
二叉树的后序遍历(非递归)
巧记心法
- 判断二叉树是否为空
- 1、左侧全部入栈,且S2全部赋予0
- 2、当全部出栈时设置循环结束(bool=0)
- 3、当对应top为0时,p指向S1[top]对应的右孩子,S2[top]=1
- 4、否则出栈访问,p=null
#define MAX_NODE 50
void PostorderTraverse(BTNode *T){BTNode *S1[MAX_NODE],*p=T;
int S2[MAX_NODE],top=0,bool=1;
if(T==NULL)printf("Empty");
else{do{while(p!=NULL){S1[++top]=p;p=p->Lchild;S2[top]=0;}if(top==0)bool=0;else if(S2[top]==0){p=S1[top]->Rchild;S2[top]=1;}else{p=S1[top];top--;visit(p->data);p=NULL;}}while(bool!=0);
}
二叉树的层次遍历
巧记心法
- 判断二叉树是否为空
- 1、根结点入队列
- 2、当队列不空时(front<rear)队首元素出队,p=队首元素,访问p
- 3、若p的左孩子不空则入队
- 4、若p的右孩子不空则入队
#define MAX_NODE 50
void levelorderTraverse(BTNode *T)
{BTNode *Queue[MAX_NODE],*p=T;
int front=0,rear=0;
if(T==NULL)printf("Empty");
else{Queue[++rear]=p;while(front<rear){p=Queue[++front];visit(p->data);if(p->Lchild!=NULL)Queue[++rear]=p->Lchild;if(p->Rchild!=NULL)Queue[++rear]=p->Rchild;}
}
}
二叉树的遍历(非递归)整理相关推荐
- 二叉树后续遍历非递归
二叉树的后序非递归遍历就比较难写,因为涉及到判断节点的访问状态- 现在有个很巧妙的方法: 前序:根->左->右 后序:左->右->根 那么可以把后序当作:根->右-> ...
- 对于二叉树三种非递归遍历方式的理解
利用栈实现二叉树的先序,中序,后序遍历的非递归操作 栈是一种先进后出的数据结构,其本质应是记录作用,支撑回溯(即按原路线返回):因此,基于其的二叉树遍历操作深刻的体现了其特性: 若后续的输入和其前面的 ...
- 二叉树的遍历 (递归和非递归实现)
二叉树的遍历 (递归实现) 用C++实现二叉树的"先根遍历"存储. 用C++实现二叉树的"先根遍历"."中根遍历"."后根遍历&q ...
- 二叉树的遍历(递归,非递归,Morris)
二叉树的遍历 目录 递归遍历 非递归遍历 Morris遍历 1. 递归遍历 递归版遍历只要当前节点不为null,就可以三次回到当前节点. public static void preOrderRecu ...
- 数据结构(六)二叉树的遍历(递归非递归方法)
数据结构(六)二叉树的遍历(递归非递归方法) 一.递归方法 1.先序遍历 void PreOrder(BiTree T) {visit(T);PreOrder(T->LChild)PreOrde ...
- 二叉树前序、中序、后序遍历非递归写法的透彻解析
前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历.递归写法,只要理解思想,几行代码.可是非递归写法却很不容易.这里特地总结下,透彻解析它们的非递归写法.其中,中序遍历的非递归写法最简 ...
- 二叉树后序遍历_二叉树后序遍历非递归实现
二叉树的后序遍历非递归实现是三种遍历实现里面最复杂的一种了. 后序遍历的顺序是左节点-右节点-根节点,因为二叉树每个节点只有指向子节点的指针而没有指向父节点的指针,因此我们需要一个额外的变量来记录是否 ...
- 线索二叉树中序非递归线索化以及递归线索化构建和遍历算法
引文 大部分教材给出了 线索二叉树的中序递归线索化以及中序遍历,但是没给出非递归,现在网上大部分非递归算法代码各种条件判断写的比较离谱,所以干脆自己总结了一个清晰的.线索二叉树中序非递归线索化以及递归 ...
- 二叉树的遍历(递归与非递归实现)
二叉树的遍历(递归与非递归实现) 二叉树的实现(三叉链表的形式) public class XieChaoThreeLinkBinTree<E> {public static class ...
- 二叉树的前序非递归遍历
二叉树的前序非递归遍历 前面学习过二叉树的前序遍历,使用递归的方式.简单回顾一下: Status PerOrder(BiTree T) {//前序遍历二叉树if (T != NULL) {Visit( ...
最新文章
- BZOJ4152 AMPPZ2014 The Captain(最短路)
- Java核心技术笔记——第 12 章 反射
- 封装一个信号量集操作函数的工具
- 视觉错觉模型_极具视觉爆发力的影院设计
- redis 了 什么地方用到_细节拉满!美团首推“百万级”Redis进阶笔记究竟有什么魅力...
- VC++ SetLayeredWindowAttributes 部分窗口透明鼠标穿透
- 最常用的四种设计模式
- SPSS 问卷与量表的区别及联系【SPSS 030期】
- 这篇文章里的代码的C#版本 (穿过已知点画平滑曲线(3次贝塞尔曲线)
- datastore java_Java Datastore.find方法代码示例
- 马云:今天互联网创业还靠免费是死路一条
- 美国梅西学院计算机科学与技术,新西兰梅西大学计算机科学硕士专业很难吗?看完入学条件就知道了...
- 猿辅导国奖选手妈妈在线分享教育经:数学新生代的成长之路
- NLP 实战(10): CSDN 领域榜标签分组更新
- nginx 配置网站通用的伪静态代码
- C语言将0xea转换为字符ea,eA第10章 c语言程序设计初步.ppt
- 《STL源码剖析》-- stl_construct.h
- 经纬恒润天津研发总部项目开工奠基仪式圆满落幕
- 网易邮箱中非常实用的工具,手机、IP等归属地
- 浅谈禁忌搜索(TabuSearch)