二叉树与哈夫曼树
2015-11-15 17:20
344 查看
1,二叉树
二叉树可以分为:完全二叉树,满二叉树,哈夫曼树;
二叉树的遍历:(递归)先序,中序,后序遍历;
二叉树的结构:根节点,左子树,右子树;
二叉树的性质:
(1). 如果二叉树的节点个数为n,则父节点的个数为n/2;
(2).若2i+1<n.则i的左孩子的节点序号为2i+1;或者i无孩子;
(3).若2i+2<n,则i的右孩子的节点序号为2i+2;或者i无孩子;
二叉树的构建:
二叉树的遍历方式:(递归算法);
2.哈夫曼树
(1)哈夫曼的性质:找出对应带权路径(WPL)最小的值是最优二叉树
(2)哈夫曼编码:左子树为0,右子树为1,从树的节点到分节点的路径长度串起来的每个值;
(3) 构建哈夫曼树
二叉树可以分为:完全二叉树,满二叉树,哈夫曼树;
二叉树的遍历:(递归)先序,中序,后序遍历;
二叉树的结构:根节点,左子树,右子树;
二叉树的性质:
(1). 如果二叉树的节点个数为n,则父节点的个数为n/2;
(2).若2i+1<n.则i的左孩子的节点序号为2i+1;或者i无孩子;
(3).若2i+2<n,则i的右孩子的节点序号为2i+2;或者i无孩子;
二叉树的构建:
// 构建二叉树 public void createTreeNode() { // 把数据构成一个节点 for (int i = 0; i < value.length; i++) { TreeNode node = new TreeNode(value[i]); // 依次添加到队列里 list.add(node); } // 遍历队列,取出节点,生成二叉树的叶子; for (int i = 0; i < list.size() / 2; i++) { TreeNode fatherNode = list.get(i); TreeNode Left = list.get(2 * i + 1); // 生成左子树 fatherNode.setLeftNode(Left); // 判断是否有右子树,生成右子树 if ((2 * i + 2) < list.size()) { TreeNode Right = list.get(2 * i + 2); fatherNode.setRightNode(Right); } } }
二叉树的遍历方式:(递归算法);
// 先序遍历 public void Pre(TreeNode root) { // 拿到根节点 System.out.print(root.getData()); // 递归方式访问,拿到左子树 TreeNode left = root.getLeftNode(); if (left != null) { Pre(left); } // 再拿到右子树 TreeNode right = root.getRightNode(); if (right != null) { Pre(right); } } // 中序遍历 public void Center(TreeNode root) { // 拿到左子树,递归调用 TreeNode left = root.getLeftNode(); if (left != null) { Center(left); } // 再访问跟节点 System.out.print(root.getData()); // 最后,拿到右子树 TreeNode right = root.getRightNode(); if (right != null) { Center(right); } } // 后序遍历 public void Last(TreeNode root) { // 拿到左子树 if (root != null) { TreeNode left = root.getLeftNode(); if (left != null) { Center(left); } // 拿到右子树 TreeNode right = root.getRightNode(); if (right != null) { Last(right); } // 最后,访问跟节点 System.out.print(root.getData()); } }
2.哈夫曼树
(1)哈夫曼的性质:找出对应带权路径(WPL)最小的值是最优二叉树
(2)哈夫曼编码:左子树为0,右子树为1,从树的节点到分节点的路径长度串起来的每个值;
(3) 构建哈夫曼树
public class HfMTree { LinkedList<HfmNode> list = new LinkedList<HfmNode>(); public int[] value = { 1, 7, 2, 4, 6, 3, 8 }; public static void main(String[] args) { HfMTree test = new HfMTree(); test.createHfm(); } // 构建哈弗曼树 public void createHfm() { // 把数组的节点值构成森林 for (int i = 0; i < value.length; i++) { HfmNode node = new HfmNode(value[i]); list.add(getIndex(value[i]), node); } // 打印出排序后的值 // for (int i = 0; i < list.size(); i++) { // System.out.println(list.get(i).getData()); // } // 构建哈夫曼树 while (list.size() > 1) { HfmNode hfmFrist = list.removeFirst(); HfmNode hfmSecend = list.removeFirst(); // 哈夫曼的值是左右节点的和 HfmNode newNode = new HfmNode(hfmFrist.getData() + hfmSecend.getData()); newNode.setLeft(hfmFrist); newNode.setRight(hfmSecend); // 按照指定的索引位置插入新的节点 list.add(getIndex(newNode.getData()), newNode); } hfmCode(list.getFirst(), ""); } // 构建哈夫曼编码 private void hfmCode(HfmNode root, String code) { if (root.getLeft() != null) { hfmCode(root.getLeft(), code + "0"); } if (root.getRight() != null) { hfmCode(root.getRight(), code + "1"); } if (root.getLeft() == null && root.getRight() == null) { System.out.println(root.getData() + "的编码:" + code); // System.out.println(code); } // return code; } /** * 定义索引下标的value值 */ // 该函数将返回一个插入的索引 private int getIndex(int value) { for (int i = 0; i < list.size(); i++) { HfmNode node = list.get(i); // 判断当前值是否比队列的值大,否则return; if (node.getData() > value) { return i; } } return list.size(); } }
相关文章推荐
- kettle4.4在eclipse中运行调试
- 《大道至简》第七章和第八章读后感
- java中的静态导入
- 迭代创建目录
- Java中的基本类型与封装类型以及自动装箱、拆箱、String类型的解释
- This version of the rendering library is more recent than your version of ADT plug-in. Please update
- git安装以及使用
- Django1.8 python3 验证码 ImageFont.truetype IOError:cannot openresource
- hdu 4283 You Are the One(区间dp)
- OC学习心得之面向对象三大特征
- 字符串string
- 结构体实现模拟时钟
- Linux 部署tomcat-实战操作
- 在QtCreator上 使用版本控制系统Git ---- 注意事项!
- 线索二叉树(先序,中序,后序)
- VC和MATLAB混合开发经验总结
- 野人学Android第二弹——Handler与Thread之间的关系
- 关于NSString的练习题
- 嵌套的向量式中断控制器(NVIC)
- 项目冲刺--第九天