您的位置:首页 > 理论基础 > 数据结构算法

【数据结构复习】二叉树的遍历——从微软2014校园招聘说起

2013-10-01 23:06 549 查看
【数据结构复习】是学习、复习常用数据结构系列文章。数据结构与算法密不可分,是程序实现功能的重要组成部分。优秀的数据结构可以提高算法的时间及空间效率。反之,将增加算法复杂度,甚至妨碍程序的正确执行。

一、引言

先从微软2014校招的一道笔试题是说起。如下

来源:http://blog.csdn.net/xiaoerlyl/article/details/12126807 第4题。

which of the following sequence(s) could not be a postorder tree walk result of a binary search tree?

A. 1,2,3,4,5 B. 3,5,1,4,2 C. 1,2,5,4,3 D. 5,4,3,2,1



题目中要求题肢中哪(几)项是不可能是二叉查找树的后序遍历。

对此题,你必须先有二叉查找树及其遍历的知识。二叉查找树是这样的二叉树,对于任一个子树,其元素必有:左节点<根节点<右节点。

解法:由于该树元素较少,可以采用排除法。利用后序遍历的性质,试出有可能的树,排除掉成立的项,剩下的就是答案。

答案:B

符合条件A、D的树很好找,如下。



问题是C的排除。根据后序遍历的性质,最后遍历到的必是根节点。即3是根。为了安排1,2,可以如下图:



最后安排5,4,有如下两种可能。明显右图才是符合的。



这样,C项也成立了。答案是选B。

当然,我们仔细分析B项,根节点是2,那么其左节点必然是1。如此一来,根据后序遍历,元素1必定被首先访问。结果,它却出现在第三位。



下面详细讲解二叉树的遍历

二、二叉树的遍历

众所周知二叉树有三种遍历方法,称为前序(pre-order)、中序(middle-order)及后序(post-order)。分别记以NLR、LNR、LRN。其中N是指当前子树的根节点。

三者的定义可以参考google、百科、wiki,但是大部分文字的描述都让人难以理解。现见最简明直观的介绍当属该站点:
http://student.zjzk.cn/course_ware/data_structure/web/shu/shu6.3.2.htm
本文将进一步阐明具体的访问路由,并配图说明到底如何遍历。

(1)首先,对于一个给定的二叉树,将其补充成满树,且每个叶节点都是空“φ”


(2)三种遍历方法的路由都是一样的,对于树中的每一条边,先按从父到子走过其左半边(halfedge),一直到围过空叶节点,再从子到父经走过右半边。



(3)如图示,每条半边的箭头指向一个节点,称该节点“被访问”。易见,树中除了叶节点,每个节点被访问三次。分别标记三次访问的半边为红、绿、蓝色。



(4)按路由顺序取每个节点的第一次被访问,就得前序遍历序列。即,取所有红半边的箭头。对于中序、后序,分别按第二次和第三次被访问顺序,即分别取绿箭头、蓝箭头即可。因此,三种序列的结果分别为

前序序列:A B D C E F

中序序列:D B A E C F

后序序列:D B E F C A

三、三种遍历的特点(不断更新)

掌握三种遍历的特点可为解二叉树题型提供方便。本节将持续更新。

前序:

1、全树根节点必在序列首位。

中序:

1、全树最左下角节点必在序列首位,最右下角节点必在序列末位。如果是查找二叉树,所得序列必是递增数列。

2、可以通过投影法求得。

后序:

1、全树根节点必在序列尾。

【版权声明:

1、本人对本博客内所有原创文章享有版权,转载请注明作者本人,并以链接形式注明出处。

2、侵犯本人版权相关利益者,个人会在新浪微博、CSDN博客中永久追踪及谴责。同时,保留追究法律责任的权利。向您的厚道致谢。

gwf

初稿 2013.10.1】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: