二叉树遍历算法

二叉树的存储结构

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;}}}
}

二叉树遍历算法(递归实现+层次遍历)相关推荐

  1. 二叉树创建及遍历算法(递归及非递归)(转)

    //二叉树处理头文件 //包括二叉树的结构定义,二叉树的创建,遍历算法(递归及非递归), /* 作者:成晓旭 时间:2001年10月7日(18:49:38-20:00:00) 内容:完成二叉树创建,二 ...

  2. 二叉树前中后、层次遍历

    #include<iostream> #include<stack> #include<queue> using namespace std;/* 二叉树遍历算法递 ...

  3. 二叉树的非递归后序遍历(双栈法和双指针法,有图有真相)

    一,前言 本文是原创作品,可能存在不足,欢迎大家指正,礼貌交流,感激不尽. 二,思路 二叉树后序遍历不同于前序遍历和中序遍历,后序遍历是三者之间最难的.下面就让我们来梳理一下代码的逻辑,看看如何轻松地 ...

  4. 二叉树遍历算法之一:前序遍历

    递归实现前序遍历 二叉树的前序遍历是指从根节点出发,按照先根节点,再左子树,后右子树的方法遍历二叉树中的所有节点,使得每个节点都被访问一次. 当调用遍历算法的时候前序遍历的具体过程如下: 首先访问根节 ...

  5. 二叉树序列化、反序列化、层次遍历python

    一.二叉树的分层遍历 给定一棵二叉树,要求进行分层遍历,每层的节点值单独打印一行,下图给出事例结构: 思路: 增加两个TreeNode:last和nlast last:表示当前遍历层最右结点 nlas ...

  6. 非递归前序遍历二叉树,非递归中序遍历二叉树,非递归后续遍历二叉树

    import java.util.Stack;public class Front {//非递归前序遍历public void front(TreeNode node) {Stack<TreeN ...

  7. leetcode第297——二叉树的序列化与反序列化(层次遍历)

    序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 1.需求 请设计一个算法 ...

  8. LeetCode 637. 二叉树的层平均值(层次遍历queue)

    1. 题目 给定一个非空二叉树, 返回一个由每层节点平均值组成的数组. 输入:3/ \9 20/ \15 7 输出: [3, 14.5, 11] 解释: 第0层的平均值是 3, 第1层是 14.5, ...

  9. LeetCode:二叉树的非递归中序遍历

    第一次动手写二叉树的,有点小激动,64行的if花了点时间,上传leetcode一次点亮~~~ 1 /* inorder traversal binary tree */ 2 #include < ...

  10. Python实现二叉树的非递归先序遍历

    思路: 1. 使用列表保存结果: 2. 使用栈(列表实现)存储结点: 3. 当根结点存在,保存结果,根结点入栈: 4. 将根结点指向左子树: 5. 根结点不存在,栈顶元素出栈,并将根结点指向栈顶元素的 ...

最新文章

  1. 前端解决跨域问题的8种方案(最新最全)
  2. 查询添加条件_035 JAVA-MySQL 约束、DML操作(增改删)、事务处理、查询数据
  3. mxnet加载保存部分参数
  4. 介绍如何安装project 2016方法
  5. Sqlserver:谈索引优化需要注意的几个方面
  6. flask 继承模版的基本使用1
  7. 将js文件编译成动态链接库(dll)文件
  8. python format 冒号_python之格式化输出
  9. java几种集合遍历速度对比
  10. vs2012 出现 无法启动IIS express的解决方案
  11. 使用Python操作PowerPoint文件中的表格
  12. [zabbix][问题解决]监控项 Received value [] is not suitable for value type [Numeric(float)]
  13. PHP数组键不存在给默认值
  14. 机器学习系列(5)_从白富美相亲看特征预处理与选择(上)
  15. one class classification
  16. cesium绘制折线_polyline
  17. 继《微博尾》之《玩转尾巴》好玩尾巴积分版
  18. 凸优化—凸松弛(Convex Relaxation)
  19. 基于51单片机的自动窗帘控制系统
  20. 软件工程的就业前景如何?程序员的发展前景如何?

热门文章

  1. Python 爬虫常用代码
  2. WIN7X64SP1极限精简版by双心
  3. 菜鸟学习oracle一看就会
  4. linux查看进程加载的jar包,[Linux] 查看jar包内容
  5. 计算机四级 信息安全工程师——计算机网络题库
  6. 数据通信技术初级工程师证题库
  7. win10 计算机 桌面图标不见了,win10系统桌面图标没了的解决方法
  8. mt管理器显示java_真正免root的MT管理器详细使用教程
  9. funcode坐标c语言,01 FunCode C 入门.doc
  10. 中国范围NPP-VIIRS逐年夜间灯光数据(2013-2020年)