博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树的遍历
阅读量:7281 次
发布时间:2019-06-30

本文共 1813 字,大约阅读时间需要 6 分钟。

二叉树的遍历(traversing binary tree)是指从根节点触发,按照某种次序依次访问二叉树中的所有结点,使得每个结点都被访问一次且仅被访问一次。

1 先(前)序遍历

若二叉树为空,则空操作返回;否则

(1)访问根节点;

(2)先序遍历左子树;

(3)先序遍历右子树。

void PreOrderTraverse(BiPTree T,void(*Visit)(BiPTree)) { /* 先序递归遍历二叉树T */   if(T)   {     Visit(T); /* 先访问根结点 */     PreOrderTraverse(T->lchild,Visit); /* 再先序遍历左子树 */     PreOrderTraverse(T->rchild,Visit); /* 最后先序遍历右子树 */   } }

2 中序遍历

若二叉树为空,则空操作返回;否则

(1)中序遍历左子树;

(2)访问根节点;

(3)中序遍历右子树。

void InOrderTraverse(BiPTree T,void(*Visit)(BiPTree)) { /* 中序递归遍历二叉树T */   if(T)   {     InOrderTraverse(T->lchild,Visit); /* 中序遍历左子树 */     Visit(T); /* 再访问根节点 */     InOrderTraverse(T->rchild,Visit); /* 最后中序遍历右子树 */   } }

3. 后序遍历

若二叉树为空,则空操作返回;否则

(1)后序遍历左子树;

(2)后序遍历右子树;

(3)访问根节点。

void PostOrderTraverse(BiPTree T,void(*Visit)(BiPTree)) { /* 后序递归遍历二叉树T */   if(T)   {     PostOrderTraverse(T->lchild,Visit); /* 后序遍历左子树 */     PostOrderTraverse(T->rchild,Visit); /* 后序遍历右子树 */     Visit(T); /* 最后访问根节点 */   } }

4. 层序遍历

若二叉树为空,则空操作返回;否则

从树的第一层,从上而下逐层遍历,在每一层中,按照从左到右的顺序逐个访问结点。

二叉树的层序遍历也就是二叉树的广度优先遍历。

算法思想:

1初始化一个队列,并把根结点入列队;

2当队列为非空时,循环执行步骤3到步骤5,否则执行步骤6;

3出队列取得一个结点,访问该结点;

4若该结点的左子树为非空,则将该结点的左子树入队列;

5若该结点的右子树为非空,则将该结点的右子树入队列;

6结束。

void LevelOrderTraverse(BiPTree T,void(*Visit)(BiPTree)) { /* 层序遍历二叉树T(利用队列) */   LinkQueue q;   QElemType a;   if(T)   {     InitQueue(&q);     EnQueue(&q,T);     while(!QueueEmpty(q))     {       DeQueue(&q,&a);       Visit(a);       if(a->lchild!=NULL)         EnQueue(&q,a->lchild);       if(a->rchild!=NULL)         EnQueue(&q,a->rchild);     }   } }

Reference:

[1] 《大话数据结构》

[2] 《数据结构 严蔚敏》

[3] wikipedia(二叉树):http://zh.wikipedia.org/wiki/%E4%BA%8C%E5%8F%89%E6%A0%91

[4] wikipedia(广度优先搜索):

http://zh.wikipedia.org/wiki/%E5%B9%BF%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7%B4%A2

[5] 博客园()

 

 

转载于:https://www.cnblogs.com/zhuyf87/archive/2012/11/03/2752157.html

你可能感兴趣的文章
基本概念
查看>>
《Linux内核设计与实现》读书笔记(10)--- 定时器和时间管理(2)
查看>>
Spark On YARN内存分配
查看>>
Python学习笔记【第十三篇】:Python网络编程一Socket基础
查看>>
Hibernate ORM框架——项目一:Hibernate查询;项目二:集合相关查询
查看>>
Ionic2开发环境搭建
查看>>
ccf 最优灌溉
查看>>
(30)批处理文件.bat
查看>>
基于MFC和opencv的FFT
查看>>
0823模拟赛
查看>>
Ajax
查看>>
HDU 1849 Rabbit and Grass 【Nim博弈】
查看>>
JMeter-Java压力测试工具-01
查看>>
搜狐在线笔试 时间复杂度O(n)实现数组A[n]中所有元素循环左移k个位置
查看>>
写python时加入缩进设置
查看>>
ubuntu下安装opencv 2.4.9 脚本,支持摄像头和cuda
查看>>
Tensorflow 线性回归预测房价实例
查看>>
UBUNTU tftp 配置
查看>>
利用runtime给系统类添加动态属性
查看>>
通讯录管理系统(C语言)
查看>>