数据结构——二叉树遍历原理及方法

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

创建二叉树

如果我们要在内存中建立一个如图6-9-1左图这样的树,为了能让每个结点确认是否有左右孩子,我们对它进行了扩展,变成图6-9-1右图的样子,也就是将二叉树中每个结点的空指针引出一个虚结点,其值为一特定值,比如“#”。我们称这种处理后的二叉树为原二叉树的扩展二叉树。扩展二叉树就可以做到一个遍历序列确定一棵二叉树了。比如图6-9-1的前序遍历序列就为AB#D##C##。

有了这样的准备,我们就可以来看看如何生成一棵二叉树了。假设二叉树的结点均为一个字符,我们把刚才前序遍历序列AB#D##C##用键盘挨个输入。实现的算法如下:

typedef int TElemType;/*树结点的数据类型*/
typedef struct  BiTNode /*结点结构*/
{TElemType data;    /*结点数据*/struct BiTNode* lchild, * rchild; /*左右孩子指针*/
} BiTNode, * BiTree;/*按前序输入二叉树中结点的值(一个字符)*/
/*# 表示空树,构造二叉链表表示二叉树T*/
void CreateBiTree(BiTree *T)
{TElemType ch;scanf("%c", &ch);if (ch=='#'){*T = NULL;}else{*T = (BiTree)malloc(sizeof(BiTree));if (!*T){exit(OVERFLOW);}(*T)->data = ch;/*生成根结点*/CreateBiTree(&(*T)->lchild);CreateBiTree(&(*T)->rchild);}
}

二叉树遍历方法

二叉树的遍历方式可以很多,如果我们限制了从左到右的习惯方式,那么主要就分为四种:

1.前序遍历
规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。如图6-8-2所示,遍历的顺序为:ABDGHCEIF。

void PreOrderTraverse(BiTree T)
{if (T == NULL){return;}printf("%c",T->data);/*显示结点数据,可以更改为其他对结点操作*/PreOrderTraverse(T->lchild);/*再先序遍历左子树*/PreOrderTraverse(T->rchild);/*最后先序遍历右子树*/
}

2.中序遍历
规则是若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树。如图6-8-3所示,遍历的顺序为: GDHBAEICF。
在这里插入图片描述

void PreOrderTraverse(BiTree T)
{if (T == NULL){return;}PreOrderTraverse(T->lchild);/*再中序遍历左子树*/printf("%c", T->data);/*显示结点数据,可以更改为其他对结点操作*/PreOrderTraverse(T->rchild);/*最后中序遍历右子树*/
}

3.后序遍历
规则是若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根结点.如图6-8-4所示;遍历的顺序为:GHDBIEFCA.

void PreOrderTraverse(BiTree T)
{if (T == NULL){return;}PreOrderTraverse(T->lchild);/*再后序遍历左子树*/PreOrderTraverse(T->rchild);/*再后序遍历右子树*/printf("%c", T->data);/*显示结点数据,可以更改为其他对结点操作*/}

数据结构——二叉树遍历原理及方法相关推荐

  1. 数据结构——二叉树遍历和常见问题

    树的概念: 1.树的概念 要了解二叉树的遍历规则必须先要知道树的结构和概念. 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合.把它叫做树是因 为它看起来像一棵 ...

  2. java数据结构二叉树遍历_java数据结构 之 二叉树的遍历(1)

    树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合 节点:上图的圆圈,比如A,B,C等都是表示 ...

  3. 数据结构--二叉树遍历(详细过程)

    目录 一.什么是二叉树? 二.二叉树的遍历 1. 先序遍历 2. 中序遍历 3.后序遍历 4. 遍历的推导 三.重要的事情 一.什么是二叉树? 1. 二叉树:一种树形结构,特点是每个结点至多只有两颗子 ...

  4. 数据结构 · 二叉树遍历

    一:创建二叉树结构 1 struct tree{ 2 char c; 3 tree left; 4 tree right; 5 }; 二:基于BFS的递归遍历: 1.先序遍历 1 void preor ...

  5. 数据结构--二叉树遍历算法的应用

    文章目录 查询二叉树中的某个节点 统计二叉树中叶子节点的个数 参数形式 全局变量形式 返回值形式 求二叉树的深度(后序遍历) 复制二叉树(后续遍历) 层次遍历二叉树 总结 查询二叉树中的某个节点 在二 ...

  6. 数据结构二叉树遍历求后序

    注意左右子树的递归 参考自https://blog.csdn.net/hou_blog/article/details/50015503

  7. 数据结构 - 二叉树遍历算法图解

  8. 【关于封装的那些事】 缺失封装 【关于封装的那些事】 泄露的封装 【关于封装的那些事】 不充分的封装 【图解数据结构】二叉查找树 【图解数据结构】 二叉树遍历...

    [关于封装的那些事] 缺失封装 目录 - 缺失封装 为什么不能缺失封装? 缺失封装潜在的原因 未意识到关注点会不断变化 混合关注点 幼稚的设计决策 示例分析一 示例分析二 总结 缺失封装 没有将实现变 ...

  9. 图说二叉树添加数据原理以及遍历原理

    一.图说二叉树添加数据原理 前提说明: 有一个学生类Student,属性:name,age; 排序:只实现age排序,即只要年龄相同则认为是相同对象(因为是说明添加原理,只要弄懂了最简单的一种,即使有 ...

最新文章

  1. 面试官:我想用Nginx提升系统10倍性能,你有哪些建议?
  2. 2亿QQ用户大调度背后的架构设计和高效运营(上)
  3. python中uniform randint_python生成随机数:uniform(), randint(), gauss(), expovariate()
  4. 数据结构和算法之稀疏数组
  5. english learning websites
  6. lambda 表达式中的 this 与普通情况下的 this 指向
  7. 一句话概括互联网巨头,简直不要太真实!哈哈哈哈哈哈哈哈哈
  8. SQL Server 备份与恢复之八:还原数据库
  9. 基于堆叠卷积长短期神经网络【CNNLSTM】模型的时序数据预测分析
  10. 计算机将图像数字化的原理,图像数字化
  11. Hadoop大数据平台构建与应用
  12. 北京地区常用dns地址解析速度快
  13. C#WinForm 分屏教程合集
  14. pandas 中上下两行相减(隔行相减) -- shift函数的使用
  15. error: command ‘gcc‘ failed with exit status 1
  16. html移动轮播后盾网,后盾网lavarel视频项目---Vue项目使用vue-awesome-swiper轮播插件...
  17. [HDU - 2852] KiKi's K-Number (树状数组+二分)
  18. 美国秘密命令谷歌、微软和雅虎交出搜索指定关键词的人员信息
  19. 根据浏览器内核区分微信、QQ、QQ浏览器
  20. hdu HDU Today2112

热门文章

  1. VUE项目目录结构说明
  2. 深受单身人士喜爱的相亲交友源码该如何开发?
  3. JavaScript常用弹出框合集
  4. 雨林木风 GHOST XP SP3 金秋特供版 YN2013.VV
  5. JS中循环遍历JSON格式数据
  6. SpringMVC List<T> @NotEmpty @NotNull 入参校验未生效
  7. 给我5个带”富“字的成语
  8. Android加固后版本更新解析包时出现问题
  9. 青龙面板使用BIlibiliTool完成每日任务+天选时刻抽奖+大会员大积分等
  10. 如何在cmd中切换硬盘,从C盘到指定硬盘的相关操作