文件的压缩和解压(其余部分复用上面)

    //将一个文件压缩/*** @param srcFile   要压缩的文件的全路径* @param dstFile   压缩后要保存在哪里的全路径*/public static void zipFile(String srcFile, String dstFile) throws IOException {FileInputStream is = null;FileOutputStream os = null;ObjectOutputStream oos = null;try {is = new FileInputStream(srcFile);byte[] b = new byte[is.available()];//创建一个和原文件大小一样的byte数组is.read(b);byte[] huffmanCodeBytes = huffmanZip(b);//创建文件的输出流,存放压缩文件os = new FileOutputStream(dstFile);//创建一个和文件输出流相关的对象输出流oos = new ObjectOutputStream(os);//以对象流的方式写入赫夫曼编码,为了恢复源文件时使用oos.writeObject(huffmanCodeBytes);oos.writeObject(huffmanCodes);//注意要将赫夫曼编码表也写入进去} catch (IOException e) {e.printStackTrace();} finally {//先开后关if (oos != null) {oos.close();}if (os != null) {os.close();}if (is != null) {is.close();}}}/*** 将压缩文件进行解压* @param zipFile   要解压的压缩文件* @param dstFile   要解压到的目标路径*/public static void unzipFile(String zipFile,String dstFile) throws IOException, ClassNotFoundException {FileInputStream is = null;ObjectInputStream ois = null;OutputStream os =null;try {is=new FileInputStream(zipFile);//创建一个和is关联的对象输入流ois = new ObjectInputStream(is);//注:存的顺序是什么,取的顺序就是什么byte[] huffmanCodeBytes = (byte[]) ois.readObject();Map<Byte,String> huffmanCodes = (Map<Byte, String>) ois.readObject();//解码byte[] bytes = decode(huffmanCodes, huffmanCodeBytes);//输出os = new FileOutputStream(dstFile);os.write(bytes);} catch (FileNotFoundException e) {e.getMessage();} finally {if (os!=null){os.close();}if (ois!=null){ois.close();}if (is!=null){is.close();}}}
}

八、二叉排序树

1、二叉排序树的创建和遍历

2、二叉排序树的删除

右子树的最小值刚好满足比左子树的全部值大,比右子树剩余节点都小,按照中序遍历后仍然是顺序的
左子树的最大值同理
注意:由于删除总共有3种情况,因此我们只需要写两种情况,剩下的else自然是最后一种情况,通过这样可以简化我们的判断条件

package Tree.BinarySortTree;import java.util.Arrays;//二叉排序树
public class Demo {public static void main(String[] args) {int[] arr = {7, 3};BinarySortTree tree = new BinarySortTree();for (int item : arr) {tree.add(new Node(item));}
//        tree.infixOrder();//测试删除叶子节点tree.del(7);tree.infixOrder();}
}class BinarySortTree {private Node root;//添加节点public void add(Node node) {if (root == null) {//root为空时直接指向noderoot = node;} else {root.add(node);}}//中序遍历public void infixOrder() {if (root != null) {root.infixOrder();} else {System.out.println("当前二叉排序树为空,无法遍历");}}//查找要删除的节点public Node searchDel(int value){if (root!=null){return root.searchDel(value);} else {return null;}}//查找要删除节点的父节点public Node searchParent(int value){if (root!=null){return root.searchParent(value);} else {return null;}}//删除节点public void del(int value){if (root==null){return;}else {Node del = root.searchDel(value);if (del==null){//未找到要删除的节点return;}if (root.left==null&&root.right==null){//能走到这里未返回,并且只有一个节点,说明要删除的就是根节点,直接置空即可//同时,根节点是唯一一个没有父节点的节点,后续也就不用再考虑父节点为空的情况了root=null;}Node parent = root.searchParent(value);if (del.right==null && del.left==null){//要删除的节点是叶子节点//注:不能直接将del置空,del只是引用了对应那个节点的地址,del=null只是del这个变量被修改,对应的节点依旧存在if (parent.left==del){parent.left=null;}if (parent.right==del){parent.right=null;}}   else if (del.right!=null && del.left!=null){//要删除有2颗子树的节点Node temp = del;while (temp.left!=null){temp=temp.left;}del(temp.value);//这里需要用一个变量保存右子树最小节点的数值,是因为如果直接给要删除的节点先赋值的话会造成死递归导致栈溢出int val = temp.value;del.value = temp.value;//del本身是一个引用,但是通过.属性的方式,修改的是真实存在树种的节点的value,因此是生效的}else {//此时del的左和右只会有一个为空if (parent==null){//根节点,且只有一颗子树if (del.right!=null){root=del.right;} else {root=del.left;}}else {if (del.left!=null){if (parent.left==del){parent.left=del.left;}if (parent.right==del){parent.right=del.left;}} else {if (parent.left==del){parent.left=del.right;}if (parent.right==del){parent.right=del.right;}}}}}}
}class Node {int value;Node left;Node right;public Node(int value) {this.value = value;}@Overridepublic String toString() {return "Node{" +"value=" + value +'}';}public void add(Node node) {if (node == null) {return;}//判断传入的节点和当前子树的根节点的value值的大小if (node.value <= this.value) {if (this.left == null) {//当前左子节点为空直接关联,否则向左子树递归添加方法this.left = node;} else {this.left.add(node);}} else {if (this.right == null) {this.right = node;} else {this.right.add(node);}}}//中序遍历public void infixOrder() {if (this.left != null) {this.left.infixOrder();}System.out.println(this);if (this.right != null) {this.right.infixOrder();}}//查找要删除的节点public Node searchDel(int value) {if (this.value == value) {return this;} else if (value < this.value) {//小于当前节点时,向左子树递归查找if (this.left != null) {return this.left.searchDel(value);//问题:这个return不加可以吗}return null;} else {if (this.right != null) {return this.right.searchDel(value);}return null;}}//查找要删除节点的父节点public Node searchParent(int value) {if ((this.left != null && this.left.value == value) || (this.right != null && this.right.value == value)) {return this;} else {//如果要查找的值比当前节点小,并且左子节点不为空,则向左递归if (this.left != null && value <= this.value) {return this.left.searchParent(value);} else if (this.right != null && value > this.value) {return this.right.searchParent(value);} else {return null;//没有找到父节点(根节点)}}}
}

高龄白菜java学习第九十八、九天(java数据结构和算法(17))相关推荐

  1. 动力节点『lol版』Java学习路线图(八)Java选学技术

    八.失落之地的辉煌 这里曾经繁华一片,被世人称作福光,搁在古老的东方就叫洞天福地!但现在一切都烟消云散,一场魔法灾难让此地化作焦土,沦为人间炼狱.此地长年被黑暗浓雾笼罩,即便世界被同化之后也没能改变土 ...

  2. Java学习系列(十八)Java面向对象之基于UDP协议的网络通信

    UDP协议:无需建立虚拟链路,协议是不可靠的. A节点以DatagramSocket发送数据包,数据报携带数据,数据报上还有目的目地地址,大部分情况下,数据报可以抵达:但有些情况下,数据报可能会丢失 ...

  3. Java学习笔记(7)——Java基础之IO多线程网络思维导图

    Java面向对象学习笔记之:包括IO(字节流,字符流,节点流,处理流).线程(线程创建,线程控制,线程同步).网络(TCP Scoket,  UDP Scoket)(全屏观看Java学习笔记(7)-- ...

  4. java学习笔记:零基础java学习路线+配套资料+书籍推荐

    公众号菜鸟名企梦2018年,精品文章汇总: 01 我的秋招 我的秋招offer 我的offer选择 秋招全面总结-必读宝典 求职必读 02 零基础学习路线 零基础-java学习路线(上) 零基础-ja ...

  5. Java 学习笔记:第一章 Java入门

    Java 学习笔记:第一章 Java入门 1.1 计算机语言发展史以及未来方向 1.2 常见编程语言介绍 C语言 C++ 语言 Java语言 PHP 语言 Object-C和Swift 语言 Java ...

  6. 【Java】Java学习笔记(2)——Java面向对象基础作业函数题

    本人私人博客:Megalomania,大部分文章会现在博客上传,有不足之处欢迎指正. 学校小学期Java课程的练习题,留个档便于以后需要时候有例子可以回忆,写的烂的地方请多多包含 1.求两个数值之和 ...

  7. Java学习路线图,内附完整Java自学视频教程+工具经验

    Java学习路线图更新日志:         增加视频<2016最新视频struts2> 密码:vhfp(2016.11.10) 增加视频<6天玩转mysql视频> 密码:a8 ...

  8. 【java学习之路】(java框架)004.Mybatis SQL映射文件详解

    02Mybatis SQL映射文件详解 ​ 在之前我们学习了mybatis的全局配置文件,下面我们开始学习mybatis的映射文件,在映射文件中,可以编写以下的顶级元素标签: cache – 该命名空 ...

  9. 【java学习之路】(java SE篇)008.集合

    集合 什么情况使用集合框架? ​ 如果不知道程序运行时需要多少对象,或者需要更复杂的方式存储对象 比较重要的 学习路线 Collection类 import java.util.ArrayList; ...

  10. 马士兵 java 学习笔记_马士兵java教程笔记1

    ---恢复内容开始--- 前记 虽然已经是个研究生了,但是会的东西还是特别的少 甚至连java都不能说是很会 所以准备从现在开始能好好的学习java 变成java master 标识符 标识符是由字母 ...

最新文章

  1. python3中tkinter button属性_Python3 tkinter基础 Button bg 按钮的背景颜色
  2. 算法分析之-渐进记号
  3. Spring Bean的获取与实例化
  4. 最新开源JavaScript 图表库 ECharts推荐
  5. Ubuntu 16.04安装idea
  6. 正态分布的前世今生(3)
  7. Linux架构之NFS共享存储1
  8. Redis cluster集群:原理及搭建
  9. Kickstart +ftp+dhcp+tftp实现Linux系统的无人值守安装
  10. android磁盘分区格式,转:磁盘分区表格式之android分区GPT
  11. JAVA WBE入门之HTML的使用(超详细,必看)附实例和代码
  12. 100以内的奇数和是多少_一百以内所有奇数和偶数有哪些
  13. 有趣的23000词根
  14. 2018_2_3_Boolean Expressions_栈_模拟
  15. ASP.NET搜索引擎
  16. java中单根_java之 单根继承与集合
  17. VC无负担实现XP风格界面(转)
  18. hanlp自然语言处理包的使用
  19. android x86 优化,x86平台如何优化安卓的多媒体类应用
  20. 关于Camera的几个重要名词解释

热门文章

  1. 【无标题】一些比较好的书桌和书架设计
  2. 利用python制作加固肋计算软件
  3. Fiddler截包后代理转发
  4. CRichEditCtrl 多格式编辑控件的使用
  5. 实现小康的路上“麦芽糖”厚积薄发
  6. 河北正定县2010年政府工作报告(1)
  7. 推荐|海泰国密通信安全解决方案 助力用户实现安全合规
  8. idea 报错:找不到什么什么包或者找不到符号,总结一下
  9. 【翻译】Android Support Library Features(二)
  10. serverless论文总结