1. 线性结构对于大量的数据来说,不管是顺序表还是链表,都有优劣:
1.1 顺序表(或者说是向量vectore),虽然它的访问(search)时间复杂度在二分查找时可以达到O(log n),但是大量数据无法分配这么多连续空间,而且其插入删除其时间复杂度不管最坏的还是平均的都很高;
1.2 链表虽然无连续存储空间的限制,它的插入删除其时间复杂度也仅仅O(1),但是它的访问(search)时间复杂度不管最坏的还是平均的都很高。
2. 树结构其绝大部分操作的平均时间复杂度为O(log n),再对树结构进行严格约束,例如:二叉树,平衡二叉树,搜索二叉树等,树的效率还会更好的,现实中很多领域使用到了树的结构。
3. 树(tree)的定义(这里采用递归的方式,递归定义树显得更自然一些):一棵树是一些节点的集合,这个集合可以为空集,若非空,一棵树由根(root)节点r以及0个或多个非空的字树(递归开始了)T1,T2...等组成,这些子树中每颗树的根都被来自r的一条有向边相连,这样不难看出:一棵树有n个节点,则有n-1条边相连。
4. 树(tree)中的常用术语
根节点root,
根的子节点child,
子节点child必定有且仅有唯一一个父节点parent,
具有相同父节点parent的节点叫做sibling,
类似的有祖父节点grandparent和孙子节点grandchild,
没有子节点的节点称为叶节点(leaf),
从根到某节点的唯一路径长度为该节点的深度(depth),所有节点深度最大的值为该树的深度,
某节点到叶节点路径最长的为该节点子树的高(height),根节点到叶节点路径最长的为节点子树的高(height),只有根节点的树高度为1,空树高度为-1,
由树的深度和高度定义可以知道 某节点的深度+该节点高度 <= 整棵树的高度
5. 现实中的树结构:
Linux的文件系统目录结构在纸上画出来就是一棵树的样子,当然,它的本质不仅仅是树,而是有指向目录本身及其指向父目录的的指针,属于类树(treelike),(类是类似的意思,不要理解错了)
6. 我们可以认为树是一种特殊的图结构,特殊之处在于:
树是无环的连通图;
树可能达到极小连通图(边最少);
树可能达到极大无环图(边最多);
一旦树根确定,节点到根之间有唯一路径。