一:概述
在前面的博文中,已经对二叉树的基础知识做了概述。接下来说明一下二叉树的遍历。
二:具体说明
在计算机程序中,遍历本身是一个线性操作。所以遍历同样具有线性结构的数组或链表,是一件比较简单的事情。
反观二叉树,是典型的非线性数据结构,遍历时需要把非线性关联的节点转化成一个线性的序列,以不同的方式来遍历,遍历出的序列顺序也不同。、
二叉树的遍历方式:
从节点的位置关系的角度来看,二叉树的遍历分为4种:
- 前序遍历
- 中序遍历
- 后序遍历
- 层序遍历
从更宏观的角度来看,二叉树的遍历归结为两大类。
- 深度优先遍历(前序遍历、中序遍历、后序遍历)
- 广度优先遍历(层序遍历)。
三:深度优先遍历
深度优先和广度优先这两个概念不止局限于二叉树,它们更是一种抽象的算法思想,决定了访问某些复杂数据结构的顺序。在访问树、图,或者其他一些复杂的数据结构时,这两个概念常常被使用到。
所谓深度优先,顾名思义,就是偏向于纵深,”一头扎到底“的访问方式。可能这种说法有些抽象。下面来仔细说说一说,前序遍历、中序遍历和后序遍历。
<1>前序遍历
二叉树的前序遍历,输出顺序是根结点、左子树、右子树。
上图是二叉树的前序遍历,每个节点外面的序号代表该节点的输出顺序,详细步骤如下:
1.首先输出的是根节点1.
2.由于根节点1存在左孩子,输出左孩子节点2.
3.由于节点2也存在左孩子,输出左孩子节点4.
4.节点4既没有左孩子,也没有右孩子,那么回到节点2,输出节点2的右孩子5.
5.节点5既没有左孩子,也没有右孩子,那么回到节点1,输出节点1的右孩子3.
6.节点3没有左孩子,但是有右孩子,因此输出节点3的右孩子节点6.
至此为止,所有节点的遍历输出完毕。
<2>中序遍历
1.二叉树的中序遍历,输出顺序是左子树、根节点、右子树。
上图是一个二叉树的中序遍历,每个节点外的序号代表该节点的输出顺序,详细步骤如下。
1.首先访问根节点的左孩子,如果这个左孩子还拥有左孩子,则继续深入访问下去,一直找到不再有左孩子的节点,并输出该节点。显然,第一个没有左孩子的节点是节点4.
2.依照中序遍历的次序,接下来输出节点4的父节点2.
3.再输出节点2的右孩子节点5.
4.以节点2为根的左子树已经输出完毕,这时再输出整个二叉树的根节点1.
5.由于节点3没有左孩子,所以直接输出根节点1的右孩子节点3.
6.最后输出节点3的右孩子节点6.
到此为止,二叉树的中序遍历输出完毕。
<3>后序遍历
二叉树的后序遍历,输出顺序是左子树、右子树、根节点。
上图是一个二叉树的后序遍历,每个节点外的序号代表该节点的输出顺序。
因为二叉树的前序遍历、中序遍历、后序遍历的思想大致相同,所以后序遍历的详细步骤就不赘述了。
根据前两个相出来很简单。