二叉树(Binary Tree)是个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点。
二叉树是有序的,即若将其左、右子树颠倒,就成为另一棵不同的二叉树。
满二叉树:所有分支结点都存在左子树和右子树,并且所有叶子结点都在同一层上
完全二叉树:树从上至下,从左至右都存在对应于满二叉树中的节点(包括叶节点)。
满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。
二叉树的遍历:
先序遍历:DLR
(1)访问根结点;
(2)先序遍历根结点的左子树;
(3)先序遍历根结点的右子树。
中序遍历:LDR
(1)中序遍历根结点的左子树;
(2)访问根结点;
(3)中序遍历根结点的右子树。
后序遍历:LRD
(1)后序遍历根结点的左子树;
(2)后序遍历根结点的右子树。
(3)访问根结点;
层次遍历:逐层遍历,先遍历完一层的LDR,在根据规则遍历下一层。可使用队列来实现。
(1)访问该元素所指结点;
(2)若该元素所指结点的左、右孩子结点非空,则将该元素所指结点的左孩子指针和右孩子指针顺序入队。
实现遍历的方法:
1.队列(先进先出),适合于广度搜索,即层级遍历
2.栈(先进后出),适合于深度搜索,即深程遍历
3.递归方法,适合于深度搜索,即深程遍历
4.使用三叉链表存储,即存储父级指针,不用堆栈即可返回父级。
5.逆转链,将再深入的子级节点中存入父级节点地址,无需扩展,但是多用户操作时需考虑锁问题
6.线索二叉树上遍历。
线索二叉树:
加了指向前驱节点和后驱节点的指针的二叉树称为线索二叉树。
最优二叉树:哈夫曼树,Haffman树
对于一组带有确定权值的叶结点,构造的具有最小带权路径长度的二叉树。.所有叶节点权值*对应路径长度,它们之和就是带权路径长度。
一棵二叉树要使其WPL 值最小,必须使权值越大的叶结点越靠近根结点,而权值越小的叶结点越远离根结点,这样的带权路径最小。
(1)由给定的n 个权值{W1,W2,…,Wn}构造n 棵只有一个叶结点的二叉树,从而得到一个二叉树的集合F={T1,T2,…,Tn};
(2)在F 中选取根结点的权值最小和次小的两棵二叉树作为左、右子树构造一棵新的二叉树,这棵新的二叉树根结点的权值为其左、右子树根结点权值之和;
(3)在集合F 中删除作为左、右子树的两棵二叉树,并将新建立的二叉树加入到集合F 中;
(4)重复(2)(3)两步,当F 中只剩下一棵二叉树时,这棵二叉树便是所要建立的哈夫曼树。
二叉树的应用:
1.查找数据元素
2.统计出给定二叉树中叶子节点的数量
3.表达式运算
4.哈夫曼树在通信中构造最短发送数据。没有二义性,凡是哈夫曼树设计出来的编码,其包含的信息就是唯一的。
5.哈夫曼树在判断中的应用。