java建树输出父节点,Java数据结构与算法8——二叉树

1.树的基本知识

树是什么树是由边和节点构成的数据结构。节点通常就是存储数据的实体。

树的常见术语

1)根:树的顶端节点。一棵树只有一个根。

2)边:节点到节点的连接

3)路径:沿着边,从一个节点走到另一个节点,所经过的节点顺序称为路径

4)父节点、子节点

5)节点、叶节点

6)度:一个节点包含的子节点数

7)子树

8)层:就是从根开始到这个节点的“代”,层数也称为高度或深度

9)遍历:按照某个特定的顺序访问节点

10)关键字:节点对象域中的某个属性,用来识别节点对象

2.二叉树的概念和理解

二叉树是什么如果树中的每个节点,最多只能有两个子节点,这样的树称为二叉树。

二叉树理解

1、二叉树不是树的特殊情形,其区别为:

1)树中节点的字节点树没有限制,而二叉树中限制节点数为不超过2个

2)树的节点没有左右之分,二叉树节点是分左右的

2、二叉树有五种基本形态

1)空二叉树,连根节点都没有

2)只有一个根节点的二叉树

3)只有左树

4)只有右树

5)完全二叉树:若设二叉树的高度为h,除第 h 层外,其它各层的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。

3、满二叉树:除叶节点外,每一个节点都有左右子节点,且叶子结点都处在最底层的二叉树

4、满二叉树肯定是完全二叉树,完全二叉树不一定是满二叉树。

5、二叉树常被用作二叉查找树、二叉排序树、二叉堆。

3.二叉树的性质

性质1:在二叉树的第 i 层上至多有2^(i-1)个结点

性质2:深度为k的二叉树至多有 2^k -1个结点

性质3:对任何一颗二叉树T,如果其叶子结点数为n0,度为2的结点数为n2,则n0=n2+1

性质4:具有N个结点的完全二叉树的深度为[log2为底N]+1

性质5:如果对一棵有N个结点的完全二叉树的结点按层序编号,即从第 1层到第[log2为底N]+1层,每层从左到右,对任一结点i(1<=i<=n)有:

(1)如果i=1,则结点i是二叉树的根;如果i>1,则其父结点是[i/2]

(2)如果2i>n,则结点i无左子节点;否则其左子节点是2i。也就是该节点是叶子节点。

(3)如果2i+1>n,则结点i无右子节点;否则其右子节点是2i+1

(4)若i为奇数且不为1,则Ki的左兄弟的编号是i-1;否则,Ki无左兄弟

(5)若i为偶数且小于n,则Ki的右兄弟的编号是i+1;否则,Ki无右兄弟

4.二叉搜索树的查找、插入、遍历、查找最大最小值和删除操作的实现

二叉搜索树是什么如果一棵二叉树,满足:左子节点的值小于节点的值,而右子节点的值大于节点的值,就被称为二叉搜索树。

提示:删除节点有两个子节点的时候,要用它的中序后继来代替该节点,算法是:找到被删除节点的右子节点,然后查找这个右子节点下的最后一个左子节点,也就是这颗子树的最小值节点,这就是被删除节点的中序后继节点。

二叉搜索树操作的效率常见的操作效率是:O(logN),是以 2为底的

用数组来表示树把树的节点遍上序号,按序存放到数组中。这样一来,查找节点就变成了查找相应的索引了。这种方法不常用,了解即可。这种方式效率不高,因为不满的节点,还有删除的节点,在数组中留下了洞,更糟糕的是删除节点时,如果需要移动子树的话,就更浪费时间了。

5.哈夫曼编码和哈夫曼树的基本知识

5.1 哈夫曼(Huffman)编码

霍夫曼编码是一种统计编码,属于无损压缩编码。

其基本思路是:对每个字符编码的码长是变化的,对于出现频率高的,编码的长度较短;而对于出现频率低的,编码长度较长。编码规则还要求:每个编码都不能是其它字符编码的前缀。

5.2 哈夫曼树

哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的带权路径长度记为WPL= (W1L1+W2L2+W3L3+...+WnLn),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)要使其WPL值最小,必须使权值越大的叶子结点越靠近根结点,而权值越小的叶子结点越远离根结点。

6.哈夫曼算法

哈夫曼树的构造方法——Huffman算法

step1.对给定的n个权值{W1,W2,W3,...,Wi,...,Wn},构成n棵只有根节点的二叉树,令起始权值为Wj,为方便处理,可以按照权值进行升序排列

step2.在这些二叉树中,选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和。

step3.从森林中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到森林中。

step4.重复2和3两步,直到森林中只有一棵二叉树为止

7.使用哈夫曼算法来实现压缩和解压的功能

哈夫曼压缩的编码部分的实现步骤:

step1.统计:读入要压缩的源文件,统计字符出现的次数

step2.建树:构建哈夫曼树

step3.编码:对哈夫曼树的左边记0,右边记1,就可以得到字符的哈夫曼编码。

step4.输出:把编码序列输出,这就是压缩后的数据

哈夫曼压缩的解码部分的实现步骤 :

step1.读取码表的信息,构建出码表来

step2.读回具体的数据内容

step3.把读回的字节还原成对应的整型数据

step4.根据码表,把内容组成的哈夫曼编码,依次转换回原始的字符,从而得到原始的

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值