数据结构-遍历二叉树

在树中搜索某种特征的节点,或者对树中全部节点逐一进行处理。

遍历二叉树是指以一定的次序访问二叉树中的每个节点,并且每个节点仅被访问一次;

例如:查询节点数据阈的内容,或输出它的值,或者找出节点位置,活着其他操作。

遍历过程实质是把二叉树的节点进行线性排列的过程,遍历时是先访问根节点还是先访问子树,要有遍历规则,采用不同的规则,则有不同的结果。

一颗非空二叉树是由根节点/左子树/右子树三个基本部分组成。用D,L,R分别表示访问根节点/遍历左右子树,则有6重遍历形式,A33 ,分别DLR、LDR、LRD、DRL、RDL、RLD。

1、 先跟遍历

如果跟不空,则依次执行访问根节点,按先跟次序遍历左子树,按先跟次序遍历右子树,否则返回。

2、 中跟遍历

如果跟不空,按中跟次序遍历左子树,访问根节点,按中跟次序遍历右子树,否则返回。

3、 后跟遍历

如果跟不空,按后跟次序遍历左子树,按后跟次序遍历右子树,最后访问根节点,否则返回。

同时还可计算树的深度,节点个数和叶子节点个数。

一般树转化为二叉树:主要根据树的孩子-兄弟存储方式来的,步骤是:

(a)加线:在各兄弟节点之间用虚线相连。可理解为每个节点的兄弟指针指向它的一个兄弟。

(b) 抹线:对每个节点仅保留它与其最左一个孩子的连线,抹去该节点与其孩子之间的连线。可理解为每个节点仅有一个孩子指针,让它指向自己的长子。

(c) 旋转:把虚线改为实线从水平方向向下旋转45度,成右写下方向,原树中实线成左斜下方向,就OK了

由于二叉树中各节点的右孩子都是原一般树中该节点的兄弟,而一般树的根节点又没有兄弟节点,因此所生成的二叉树的根节点没有右子树。在所生成的二叉树中某一节点的左孩子仍是原来书中该节点的长子,并且是它的最左孩子。

图是一个是一般树转为二叉树的实例:

来再还原回来:二叉树还原为一般树

必须是由某一棵树转化而来的且没有右子树,

(a) 加线:若某节点i是双亲节点的左孩子,则将该节点i的右孩子以及当且仅当连续地沿着右孩子的右链不断搜索到所有右孩子都分别与节点i的双亲节点用虚线链接。

(b) 抹线:把原二叉树中所有双亲节点与其右孩子的连线抹去。这里的右孩子实质是原一般树节点的兄弟,抹去的连线是兄弟关系。

(c)整理:把虚线改成实现,把节点按层次排列。

以上,二叉树&树~

发布于 2017-11-06