繁体
先访问
树,然后再访问
节
;
存储
先访问
节
,然后再访问所有的
树;
树的遍历
对于随机的树,
度的平均复杂度是o(logn),但是没有限制而且不随机的树
度也可以达到o(n),也就是除了叶节
都只有一个
树,或者常数个分支的情况。所以树作为数据结构时通常需要另外
行平衡。
二叉树专用,先访问左
树,然后是
节
,最后是右
树。
事实上也可以把左右的顺序反过来。这些由
开始的遍历方法也适用于特定的一个
树。
森林
对于一般的树,可以用和普通的图一样的方法遍历,比如
度优先搜索和宽度优先搜索。如果和树的每个节
相邻的
有固定的顺序,
度优先搜索可以不储存当前
以外的任何信息,而且不用判重。而在有
树中更方便,所以有
树中很少使用宽度优先搜索。
中序遍历
后序遍历
有固定的可能可以留空的位置,这棵树叫
n叉树。其中每个节
都可以有两个固定位置的
树的有
树叫
二叉树,二叉树中每个节
的两个
树分别叫
左
树和右
树,由于位置固定,没有左
树的时候也是可以有右
树的。而“多叉树”通常并不指n为任意值的n叉树,只是在和n叉树作比较的时候表示普通的有
树。
对于有
树的从
开始的
度优先搜索遍历,有三
特定的顺序:
本章已阅读完毕(请
击下一章继续阅读!)
对于
节
是有顺序的有
树,每条边都可以以固定的位置分别储存。对于完全二叉树甚至能直接用一个数组访问所有节
,不另外储存边的信息。有的树可以被设计成固定的从
节
开始访问,这时候可以不储存父节
。同样的,有的树也可以省略
节
,例如并查集。
前序遍历
对于普通的树,可以像图一样为每一个
存储一个边表(通常
顺序存和每一个
的关系的叫
邻接矩阵,存
的边的叫
邻接表),或者直接存储所有边的边表等。由于树是稀疏图,所以一般不用邻接矩阵存储。对于有
树,如果用为每一个
储存一个边表的方法,由于每一棵树都只有一个父节
,所以通常指向父节
的边不存在这个表中。同时如果
节
是没有顺序的,也是因为一个节
的
节
不会同时是其他节
的
节
,也可以把
节
直接当成存边的链表的节
,这时候每个节
只需要储存两个指针,所以这
存储方法有时候也会被叫
多叉树转二叉树。
注意对于每一
遍历,事实上都得先访问
节
,这里的遍历顺序是指
理节
中的数据的顺序。已知中序遍历和任一其他遍历的情况下,可以还原一个二叉树。一个直观的方法是
前序或者反转的后序
一个
中序排序的搜索树。已知前序和中序也可以还原一棵树,但是不能知
二叉树中一个节
唯一的
树是在左边还是右边。