1.树的类型定义:
(1)数据对象D:D是具有相同特性的数据元素的集合。
(2)数据关系R:若D为空集,则成为空树。
否则:在D中存在唯一的称为根的数据元素root。当n>1时,其余结点可分为n(n>0)个互不相交的有限集T1, T2, T3, ..., Tm,其中每一棵子集本身又是一课符合本定义的树,称为根root的子树。
2.树的基本操作:
(1)查找类:
①Root(T)——求树的根结点
②Value(T, cur_elem)——求当前结点的元素值
③Parent(T, cur_elem)——求当前结点的双亲结点
④LeftChile(T, cur_elem)——求当前结点的最左孩子
⑤RightSibling(T, cur_elem)——求当前结点的右兄弟
⑥TreeEmpty(T)——判定树是否为空树
⑦TreeDepth(T)——求树的深度
⑧TraverseTree(T, Visit())——遍历树
(2)插入类:
①InitTree(&T)——初始化树
②CreateTree(&T, definition)——按定义构造树
③Assign(&T, cur_elem, value)——给当前结点赋值
④InsertChild(&T, &p, i, root)——将以root为根的树插入为结点p的第i棵子树
(3)删除类:
①ClearTree(&T):将树清空
②DestroyTree(&T):销毁树的结构
③DeleteChile(&T, &p, i):删除结点p的第i棵子树
3.有向树:有确定的根,树根和子树根之间为有向关系。
4.有序树:子树之间存在确定的次序关系。
5.无序树:子树之间不存在确定的次序关系。
6.线性结构对比树形结构:
(1)线性结构:第一个元素无前驱,最后一个元素无后继,其它元素一个前驱一个后继。
(2)树形结构:根结点无前驱,多个叶子结点无后继,其它元素一个前驱多个后继。
7.二叉树的类型定义:二叉树或为空树,或是由一个根结点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。
8.二叉树有五种基本形态:空树、只含根结点、右子树为空、左子树为空、左右子树均不空。
9.二叉树的主要基本操作:
(1)查找类:
①Root(T)——查找二叉树根
②Value(T, elem)——按值查找结点
③Parent(T, elem)——查找结点双亲
④LeftChild(T, elem)/RightChile(T, elem)——查找结点左孩子/查找结点右孩子
⑤LeftSibling(T, e)/RightSibling(T, elem)——查找结点左兄弟/查找结点右孩子
⑥BiTreeEmpty(T)——判断二叉树是否为空
⑦BiTreeDepth(T)——求二叉树深度
⑧PreOrderTraverse(T)——先序遍历二叉树
⑨InOrderTraverse(T)——中序遍历二叉树
⑩PostOrderTraverse(T)——后序遍历二叉树
⑪LevelOrderTraverse(T)——层序遍历二叉树
(2)插入类:
①InitBiTree(&T)——初始化二叉树
②Assign(T, &elem, value)——给结点赋值
③CreateBiTree(&T, definition)——按照定义构造二叉树
④InsertChild(&T, p, L/R, c)——在某结点插入孩子
(3)删除类:
①ClearBiTree(&T)——清空二叉树
②DestroyBiTree(&T)——销毁二叉树
③DeleteChild(&T, p, L/R)——删除某结点孩子
10.满二叉树:深度为k且含有2k - 1个结点的二叉树。
11.完全二叉树:树中所含的n个结点和满二叉树中编号为1 ~ n的结点一一对应。
12.二叉树的性质:
(1)性质1:在二叉树的第i层上至多有2i-1个结点。(i ≥ 1)
用归纳法证明:
归纳基:i = 1时,只有一个根结点,2i-1 = 20 = 1成立;
归纳假设:假设对所有的j,1 ≤ j < i,命题成立;
归纳证明:二叉树上每个结点至多有两棵子树,则第i层的结点数 = 2i-1 × 2 = 2i-1。
(2)性质2:深度为k的二叉树上至多含有2k - 1个结点。(k ≥ 1)
证明:基于性质1,深度为k的二叉树上的结点数至多为20 + 21 + ... + 2k-1 = 2k - 1。
(3)性质2推广:满二叉树第k层的结点个数比其第1 ~ k-1层所有结点总数多1个。
(4)性质3:对任何一颗二叉树,若它含有n0个叶子结点、n2个度为2的结点,则必存在:n0 = n2 + 1。
证明:设二叉树上结点总数n = n0 + n1 + n2,二叉树上分支总数b = n1 + 2n2,而b = n - 1 = n0 + n1 + n2 - 1,所以n0 = n2 + 1。
(5)性质3推广:已知一棵度为m的树中有N1个度为1的结点,N2个度为2的结点,...,Nm个度为m的结点,该树中叶子结点数为:1 + N2 + 2N3 + ... + (m-1)Nm。
证明:设N为总结点数,N0为叶子结点数,则N = N0 + N1 + N2 + ... + Nm,又有:N - 1 = 分支总数,则N - 1 = N1 × 1 + N2 × 2 + ... + Nm × m,所以N0 = 1 + N2 + 2N3 + ... + (m-1)Nm。
(6)性质4:具有n个结点的完全二叉树的深度为⌊log2n⌋ + 1。(⌊n⌋为对n的向下取整)
证明:设完全二叉树的深度为k,则根据性质2可得2k-1 ≤ n < 2k,即k - 1 ≤ log2n < k,因为k只能是整数,所以k = ⌊log2n⌋ + 1。
(7)性质5:若对含有n个结点的完全二叉树从上到下且从左至右进行1 ~ n的编号,则对完全二叉树中任意一个编号为i的结点:
①若i = 1,则该结点是二叉树的根,无双亲,否则,编号为⌊i/2⌋的结点为其双亲结点;
②若2i > n,则该结点无左孩子,否则,编号为2i的结点为其左孩子结点;
③若2i + 1 > n,则该结点无右孩子结点,否则,编号为2i + 1的结点为其右孩子结点。