1、查找二叉树概念 查找二叉树,又称二叉排序树(Binary Sort Tree)。一棵查找二叉树或者是一棵空树,或者满足以下递归条件: (1)查找树的左右子树各是一棵查找树; (2)若查找树的左子树非空,则其左子树上的各节点值均小于根节点的值; (3)若查找树的右子树非空,则其右子树上的各节点值均大于根节点的值。 2、查找二叉树的基本操作 查找二叉树的基本操作有查找、插入节点和删除节点。对于下面一棵查找二叉树而言: ● 查找:首先将关键字和根节点比较,如果小于则到根节点的左子树中查找,如果大于则进入右子树查找。 ● 插入节点:在查找二叉树中插入一个节点需要分以下几种情况: (1)如果相同键值的节点已在查找二叉树,则不在插入; (2)如果查找二叉树为空树,则以新节点为查找二叉树; (3)将要插入节点的键值与插入后的父节点的键值比较,就能确定新节点是父节点的左子节点还是右子节点,并进行相应插入。 ● 删除节点:删除节点也要分情况: (1)若待删除的节点p是叶子节点,则直接删除该节点; (2)若待删除的节点p只有一个子节点,则将这个子结点与待删除结点的父结点直接连接,然后删除节点p; (3)最复杂的就是有两个子节点的情况,可以考虑两种方法,都是同样的思想:用被删除节点A的左子树的最右节点或者A的右子树的最左节点作为替代A的节点,并修改相应的最左或最右节点的父节点的指针。 3、哈夫曼树(最优二叉树) 首先来了解几个概念: ● 树的路径长度:树的根节点到每个节点的路径长度之和,完全二叉树的路径长度是最短的。 ● 权:节点值就是权重,表示计算机访问该数据的频度。 ● 带权路径长度:节点的权重x 路径长度。 ● 树的带权路径长度:所有叶子节点的带全路径长度之和。 哈夫曼树就是一种树的带权路径长度最小的树。 如上图中的两棵树,右边树的带权路径长度为:8*1 + 4*2 + (1+2)*3 = 25 左边数的带权路径长度为:1*1 + 2*2 + (4+8)*3 = 41 4、构造哈夫曼树 假设有一组权值{ 5,29,7,8,14,23,3,11 },下面利用这组权值演示构造哈夫曼树的过程。 第一步:以这8个权值作为根节点的权值构造具有8棵树的森林: 第二步:从中选择两个根的权值最小的树作为左右子树构造一棵新树,并将这两棵树从森林中删除,并将新树添加进去: 重复上面步骤,直到森林中只有一棵树为止,得到: 这就是一棵哈夫曼树。可以看出,访问权值或者说频度比较低节点的都排在了最下面。 5、哈夫曼编码 哈夫曼编码是在哈夫曼树的基础上,定义左边0,右边为1,如图,那么23的编码为:00 ,8的编码为011,这就是哈夫曼编码。