所谓遍历, 无非就是把1个容器的所有元素逐个输出, 而这个输出是线性的。

但是二叉树是1个非线性的容器,  如何把它的元素按一定顺序输出就是1个值得学习的课题了。

一般来讲, 遍历二叉树有3种方法, 先序遍历, 中序遍历以及后续遍历。 无论哪一种方法都可以把二叉树里的元素线性输出。但是无论哪种方法,都无法根据输出后的线性元素还原成正确的二叉树结构, 除非先把这棵二叉树转化为完全二叉树(添加不存放实际数据的空节点)。

二叉树先序遍历的定义:

定义很简单, 无非3个步骤:

第一步: 先访问二叉树的根节点

第二步: 先序遍历左子树

第三步 :  先序遍历右子树

我们来看看上面先序遍历的定义, 里面的步骤居然也用到了先序遍历这个动作, 有经验的读者也许发现这就是递归了。

二叉树先序遍历的伪算法:

我们来假设先序遍历这个函数是f(Tree * A);   其中A是二叉树树类型的指针

那么f(Tree A)可以利用递归来定义:

f(Tree * A){printf(A->root);    //root是Tree类型的一个成员,表示根节点if (NULL != A->LeftTree()){  //LeftTree 是Tree的一个成员,返回Tree的左子树的指针(也是Tree类型指针) f(A->LeftTree());} if (NULL != A->RightTree()){  //RightTree 是Tree的一个成员,返回Tree的右子树的指针(也是Tree类型指针)f(A->RightTree());}
}

见到这个函数会不断地调用自己, 直到左子树和右子树都为空(叶子节点), 才会遇到出口。

如下图:

二叉树中序遍历的定义:

二叉树的中序遍历其实跟先序遍历很类似, 都是利用递归来实现的, 但是中序遍历执行步骤有些不同。

中序遍历也分3个步骤:

第一步: 中序遍历左子树

第二步: 访问根节点

第三步 :  中序遍历右子树

可以看出,跟先序遍历的差别无非就是先遍历左子树和先访问根节点的区别。

二叉树中序遍历的伪算法:

假设中序遍历这个函数是g(Tree * A);   其中A是二叉树树类型的指针

那么g(Tree A)可以利用递归来定义:

g(Tree * A){if (NULL != A->LeftTree()){  //LeftTree 是Tree的一个成员,返回Tree的左子树的指针(也是Tree类型指针) g(A->LeftTree());} printf(A->root);    //root是Tree类型的一个成员,表示根节点if (NULL != A->RightTree()){  //RightTree 是Tree的一个成员,返回Tree的右子树的指针(也是Tree类型指针)g(A->RightTree());}
}

如下图:

注意与先序遍历的细节区别啊~

二叉树后序遍历的定义:

理解了先序和中序遍历后, 后序遍历也不难理解, 都是一个原理的啊。

后序遍历的3个步骤:

第一步: 后序遍历左子树

第二步: 后序遍历右子树

第三步 :  访问根节点

可以见到, 左子树和右子树的顺序不变, 只不过根节点的顺序留到最后了。

二叉树后序遍历的伪算法:

假设后序遍历这个函数是k(Tree * A);   其中A是二叉树树类型的指针

那么k(Tree A)可以利用递归来定义:

k(Tree * A){if (NULL != A->LeftTree()){  //LeftTree 是Tree的一个成员,返回Tree的左子树的指针(也是Tree类型指针) k(A->LeftTree());} if (NULL != A->RightTree()){  //RightTree 是Tree的一个成员,返回Tree的右子树的指针(也是Tree类型指针)k(A->RightTree());}printf(A->root);    //root是Tree类型的一个成员,表示根节点
}

如下图:

数据结构 二叉树的遍历相关推荐

  1. 数据结构——二叉树的遍历

    "树"是一种重要的数据结构,本文浅谈二叉树的遍历问题,採用C语言描写叙述. 一.二叉树基础 1)定义:有且仅有一个根结点,除根节点外,每一个结点仅仅有一个父结点,最多含有两个子节点 ...

  2. 数据结构-二叉树层次遍历

    首先介绍下二叉树的层次遍历即按照顺序对树节点依次访问,如下图: 顺序遍历的结果为:ABCDEFGHIJK 我们可以借助一个队列来实现二叉树的层次遍历:思路如下: 先将二叉树根节点入队,然后出队,访问该 ...

  3. 数据结构-二叉树的遍历

    二叉树是每个结点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用于实现二叉查 ...

  4. java遍历树结构数据_Java数据结构——二叉树的遍历(汇总)

    二叉树的遍历分为深度优先遍历(DFS)和广度优先遍历(BFS) DFS遍历主要有: 前序遍历 中序遍历 后序遍历 一.递归实现DFS Node.java: public class Node { pr ...

  5. 数据结构 - 二叉树的遍历

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 二叉树的遍历 N:访问根结点,L:遍历根结点的左子树 ...

  6. 第五期 C/C++数据结构 二叉树的遍历以及结点数、深度

    代码详见后面 实验三 树和二叉树 一.实验目的 1.使学生熟练掌握二叉树的逻辑结构和存储结构(重点). 2.熟练掌握二叉树的各种遍历算法(难点). 二.实验原理及说明 1. 前序遍历算法思想: (1) ...

  7. Java数据结构——二叉树的遍历

    作者:敲代码の流川枫 博客主页:流川枫的博客 专栏:和我一起学java 语录:Stay hungry stay foolish 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器--牛客 ...

  8. 02331 数据结构 二叉树的遍历

    算法思想 按一定规则和顺序走遍二叉树的所有结点,使每一个节点都被访问一次,且只被访问一次. (1)先序遍历[根->左->右] 1. 访问根节点2. 遍历左孩子3. 遍历有孩子 (2)中序遍 ...

  9. 二叉树的遍历实验报告C语言,数据结构-二叉树的遍历(类C语言描写叙述)

    遍历概念 所谓遍历(Traversal)是指沿着某条搜索路线.依次对树中每一个结点均做一次且仅做一次訪问.訪问结点所做的操作依赖于详细的应用问题. 遍历是二叉树上最重要的运算之中的一个,是二叉树上进行 ...

最新文章

  1. 15-shell 输入/输出重定向
  2. 计算机应用基础教学实践活动,计算机应用基础与中职数学课程融合教学实践.doc...
  3. 【算法数据结构Java实现】Java实现动态规划(背包问题)
  4. 用VC开发串口通信dll控件
  5. data 谷歌浏览器更改user 路径_chrome浏览器的跨域设置——包括版本49前后两种设置...
  6. “如果把所有的经济学家都放在一起,他们永远不会得出结论。 - 萧伯纳
  7. 判断字符串是否为正整数 浮点小数
  8. java里面value_「Java基础知识」Java中包含哪些运算符
  9. google的一些秘密入口
  10. Redis 处理客户端连接的一些内部实现机制
  11. PAT 1060 Are They Equal (25 分)
  12. perl表达 匿名数组和匿名哈希
  13. (转)专访Palantir创始人:如何接二连三创出独角兽公司?
  14. 嵌入式和单片机的区别是什么
  15. git add 后git reset --hard xxx的代码丢失,代码如何找回
  16. 人工智能+建筑,会产生什么?
  17. 国产统信UOS使用FTP跨网段访问桌面云神州网信版windows的共享文件
  18. excel内容少却文件很大_(excel内容很少,文件却很大,怎么解决)excel表格数据少但是过大怎么办...
  19. 【NOIP 2017】Day2 T3 列队
  20. 全国高校通信与信息系统专业排名

热门文章

  1. [密码学] Shannon保密系统的信息理论 熵与完美保密性
  2. 【笔记】公钥密码学之RSA
  3. Eclipse中Git的使用与Junit单元测试的编写
  4. Redis的特点持久化的原理及优缺点
  5. WIN32获取进程当前目录
  6. linux migrations病毒守付进程分析
  7. 递归和非递归实现二叉排序树(BST)的查找操作
  8. 1016 Phone Bills (25 分) 【未完成】【难度: 中 / 知识点: 模拟】
  9. 项目: 用easyx实现消砖块
  10. 排列若干个字符串,判断是否首尾可以连接在一起