一、树的定义
树(Tree)是 n(n≥0) 个结点的有限集T,并且当 n>0 时满足下列条件:
有且仅有一个特定的称为根(Root)的结点;
当 n>1 时,其余结点可以划分为 m(m>0) 个互不相交的有限集T1、T2 、…、Tm,每个集 Ti(1≤i≤m) 均为树,且称为树T的子树(SubTree)。
特别地,不含任何结点(即n=0)的树,称为空树。
如下是一棵树的结构:
二、基本术语
根节点(root): 树顶端的节点称之为根节点,也叫树根。
子树(subTree): 除根节点之外,其他节点可以分为多个树的集合,叫做子树,如图1中,H这个节点可以称之为一颗子树,而D、H、I三个节点组合起来也可以叫做一颗子树。
结点(node): 存储数据元素和指向子树的链接,由数据元素和构造数据元素之间关系的引用组成。
子结点: 树中一个结点的子树的根结点称为这个结点的子结点,如图1中的A的子结点有B、C、D
双亲结点: 树中某个结点有孩子结点(即该结点的度不为0),该结点称为它孩子结点的双亲结点,也叫前驱结点。双亲结点和孩子结点是相互的,如图1中,A的孩子结点是B、C、D,B、C、D的双亲结点是A。
兄弟结点: 具有相同双亲结点(即同一个前驱)的结点称为兄弟结点,如图1中B、C、D为兄弟结点。
堂兄弟节点: 同一层,父节点不同,或者说双亲节点在同一层的节点称之为堂兄弟节点。如图1的E、F、G、H、I。
叶子结点: 度为0的结点称为叶子结点,也叫终端结点。如图1的E、F、G、H、I
分支结点: 度不为0的结点称为分支结点,也叫非终端结点。如图1的A、B、C、D
节点的祖先: 从根节点到某一节点一路顺下来的除了该节点的所有节点都是该节点的祖先节点。
节点的子孙: 以某节点为根的子树中,任何一个节点都是其子孙,也就是说这个节点下面与这个节点有关的节点都是这个节点的子孙。
结点的度: 结点所有子树的个数称为该结点的度,如图1,A的度为3,B的度为2。
树的度: 树中所有结点的度的最大值称为树的度,如图1的度为3。
结点的层次: 从根结点到树中某结点所经路径的分支数称为该结点的层次。根结点的层次一般为1(也可以自己定义为0),这样,其它结点的层次是其双亲结点的层次加1.
树的深度: 从根节点开始、自顶向下逐层累加(根节点的高度是1)助记:深度从上到下。
树的高度: 从叶节点开始、自底向上逐层累加(叶节点的高度是1)助记:高度由下向上。
有序树和无序树: 树中任意一个结点的各子树按从左到右是有序的,称为有序树,否则称为无序树。
森林: 由m棵不相交的树组成的集合,叫做森林。
数据元素: 具有相同特性的数据元素的集合。
结构关系: 树中数据元素间的结构关系由树的定义确定。
三、树的类型
常见的树有二叉树、平衡二叉树、二叉查找树、B树、B+树、哈夫曼树、B*树、红黑树和trie树等。
四、基本操作
- 创建树IntTree(&T)
- 销毁树DestroyTree(&T)
- 构造树CreatTree(&T,deinition)
- 置空树ClearTree(&T)
- 判空树TreeEmpty(T)
- 求树的深度TreeDepth(T)
- 获得树根Root(T)
- 获取结点Value(T,cur_e,&e)
- 数据赋值Assign(T,cur_e,value)
- 获得双亲Parent(T,cur_e)
- 获得最左孩子LeftChild(T,cur_e)
- 获得右兄弟RightSibling(T,cur_e)
- 插入子树InsertChild(&T,&p,i,c)
- 删除子树DeleteChild(&T,&p,i)
- 遍历树TraverseTree(T,visit())
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。