二叉树遍历算法(递归实现+层次遍历)
二叉树遍历算法
二叉树的存储结构
typedef struct BTNode
{char data; //这里默认结点data为char型struct BTNode *lchild;struct BTNode *rchild;
}BTNode;
二叉树的遍历算法
1 先序遍历
先序遍历的操作如下。
如果二叉树为空树,则什么都不做;否则:
1)访问根节点
2)先序遍历左子树
3)先序遍历右子树
描述如下:
void preorder(BTNode *p)
{if(p != NULL){visit(p); //假设访问函数Visit()已经定义过preorder(p->lchild); //先序遍历左子树preorder(p->rchild); //先序遍历右子树}
}
2 中序遍历
中序遍历的操作如下。
如果二叉树为空树,则什么都不做;否则:
1)中序遍历左子树
2)访问根节点
3)中序遍历右子树
描述如下:
void inorder(BTNode *p)
{if(p != NULL){inorder(p->lchild);visit(p);inorder(p->rchild);}
}
3 后序遍历
后序遍历的操作如下。
如果二叉树为空树,则什么都不做;否则:
1)后序遍历左子树
2)后序遍历右子树
3)访问根节点
描述如下:
void postorder(BTNode *p)
{if(p != NULL){postorder(p->lchild);postorder(p->rchild);visit(p);}
}
4 层次遍历
上图所示为二叉树的层次遍历,即按照箭头所指方向,按照1、2、3、4的层次顺序,对二叉树中各个结点进行访问(此图反映的是自左至右的层次遍历,自右至左的方式类似)
要进行层次遍历,需要建立一个循环队列先将二叉树头结点入队列,然后出队列,访问该结点,如果它有左子树,则将左子树的根结点入队;如果它有右子树,则将右子树的根结点入队。然后出队列,对出队结点访问。如此反复,直到队列为空为止。
由此得到的对应算法如下:
void level(BTNode *p)
{int front,rear;BTNode *que[maxSize]; //定义一个循环队列,用来记录将要访问的层次上的结点front = rear = 0;BTNode *q;if(p != NULL){rear = (rear + 1) % maxSize;que[rear] = p; //根结点入队while(front != rear) //当队列不空的时候进行循环{front = (front + 1) % maxSize;q = que[front]; //队头结点出队visit(q); //访问队头结点if(q->lchild != NULL) //如果左子树不空,则左子树的根结点入队{rear = (rear + 1) % maxSize;que[rear] = q->lchild;}if(q->rchild != NULL) //如果右子树不空,则右子树的根结点入队{rear = (rear + 1) % maxSize;que[rear] = q->rchild;}}}
}
二叉树遍历算法(递归实现+层次遍历)相关推荐
- 二叉树创建及遍历算法(递归及非递归)(转)
//二叉树处理头文件 //包括二叉树的结构定义,二叉树的创建,遍历算法(递归及非递归), /* 作者:成晓旭 时间:2001年10月7日(18:49:38-20:00:00) 内容:完成二叉树创建,二 ...
- 二叉树前中后、层次遍历
#include<iostream> #include<stack> #include<queue> using namespace std;/* 二叉树遍历算法递 ...
- 二叉树的非递归后序遍历(双栈法和双指针法,有图有真相)
一,前言 本文是原创作品,可能存在不足,欢迎大家指正,礼貌交流,感激不尽. 二,思路 二叉树后序遍历不同于前序遍历和中序遍历,后序遍历是三者之间最难的.下面就让我们来梳理一下代码的逻辑,看看如何轻松地 ...
- 二叉树遍历算法之一:前序遍历
递归实现前序遍历 二叉树的前序遍历是指从根节点出发,按照先根节点,再左子树,后右子树的方法遍历二叉树中的所有节点,使得每个节点都被访问一次. 当调用遍历算法的时候前序遍历的具体过程如下: 首先访问根节 ...
- 二叉树序列化、反序列化、层次遍历python
一.二叉树的分层遍历 给定一棵二叉树,要求进行分层遍历,每层的节点值单独打印一行,下图给出事例结构: 思路: 增加两个TreeNode:last和nlast last:表示当前遍历层最右结点 nlas ...
- 非递归前序遍历二叉树,非递归中序遍历二叉树,非递归后续遍历二叉树
import java.util.Stack;public class Front {//非递归前序遍历public void front(TreeNode node) {Stack<TreeN ...
- leetcode第297——二叉树的序列化与反序列化(层次遍历)
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 1.需求 请设计一个算法 ...
- LeetCode 637. 二叉树的层平均值(层次遍历queue)
1. 题目 给定一个非空二叉树, 返回一个由每层节点平均值组成的数组. 输入:3/ \9 20/ \15 7 输出: [3, 14.5, 11] 解释: 第0层的平均值是 3, 第1层是 14.5, ...
- LeetCode:二叉树的非递归中序遍历
第一次动手写二叉树的,有点小激动,64行的if花了点时间,上传leetcode一次点亮~~~ 1 /* inorder traversal binary tree */ 2 #include < ...
- Python实现二叉树的非递归先序遍历
思路: 1. 使用列表保存结果: 2. 使用栈(列表实现)存储结点: 3. 当根结点存在,保存结果,根结点入栈: 4. 将根结点指向左子树: 5. 根结点不存在,栈顶元素出栈,并将根结点指向栈顶元素的 ...
最新文章
- 前端解决跨域问题的8种方案(最新最全)
- 查询添加条件_035 JAVA-MySQL 约束、DML操作(增改删)、事务处理、查询数据
- mxnet加载保存部分参数
- 介绍如何安装project 2016方法
- Sqlserver:谈索引优化需要注意的几个方面
- flask 继承模版的基本使用1
- 将js文件编译成动态链接库(dll)文件
- python format 冒号_python之格式化输出
- java几种集合遍历速度对比
- vs2012 出现 无法启动IIS express的解决方案
- 使用Python操作PowerPoint文件中的表格
- [zabbix][问题解决]监控项 Received value [] is not suitable for value type [Numeric(float)]
- PHP数组键不存在给默认值
- 机器学习系列(5)_从白富美相亲看特征预处理与选择(上)
- one class classification
- cesium绘制折线_polyline
- 继《微博尾》之《玩转尾巴》好玩尾巴积分版
- 凸优化—凸松弛(Convex Relaxation)
- 基于51单片机的自动窗帘控制系统
- 软件工程的就业前景如何?程序员的发展前景如何?
热门文章
- Python 爬虫常用代码
- WIN7X64SP1极限精简版by双心
- 菜鸟学习oracle一看就会
- linux查看进程加载的jar包,[Linux] 查看jar包内容
- 计算机四级 信息安全工程师——计算机网络题库
- 数据通信技术初级工程师证题库
- win10 计算机 桌面图标不见了,win10系统桌面图标没了的解决方法
- mt管理器显示java_真正免root的MT管理器详细使用教程
- funcode坐标c语言,01 FunCode C 入门.doc
- 中国范围NPP-VIIRS逐年夜间灯光数据(2013-2020年)