一、为什么需要树这样数据结构、

1.数组存储方式分析
优点:通过下表方式访问元素,速度快。对于有序数组没还可以使用二分查找提高检索速度。
缺点:如果要检索某一个具体值,效率比较低下
2.链式存储方式分析
优点:在一定程度上对数组存储方式进行优化(比如插入一个节点,只需要将插入节点,链接到链表当中可删除的效率也很好)。
缺点:在进行检索时,效率仍然比较低,比如(检索某个数值,需要从头结点开始遍历)
3.树存储方式分析
提高数据存储,读取的效率,比如利用二叉排序树,既可以保证数据的检索速度。同时也可以保证数据的插入,删除,修改的速度。

二、树示意图

三、二叉树的概念

1.树有很多种,每个节点最多只能有两个子节点的一种形式称为二叉树
2.二叉树的子节点分为左节点和右节点

3.如果二叉树的所有叶子节点都在最后一层并且总结点数 = 2^n-1,(n为层数),则我们称为满二叉数。

4.如果二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续,我们称为完全二叉树。

四、二叉树的代码实现

1、节点类

public class TreeNode {private TreeNode leftTreeNode;private TreeNode rightTreeNode;private Integer value;public Integer getValue() {return value;}public void setValue(Integer value) {this.value = value;}public TreeNode(Integer value){this.value = value;}public TreeNode getLeftTreeNode() {return leftTreeNode;}public void setLeftTreeNode(TreeNode leftTreeNode) {this.leftTreeNode = leftTreeNode;}public TreeNode getRightTreeNode() {return rightTreeNode;}public void setRightTreeNode(TreeNode rightTreeNode) {this.rightTreeNode = rightTreeNode;}@Overridepublic String toString() {return "TreeNode{" +"leftTreeNode=" + leftTreeNode +", rightTreeNode=" + rightTreeNode +", value=" + value +'}';}
}

2、二叉树管理类

import java.util.LinkedList;public class BinaryTree {// 新建代表整棵树的节点TreeNode root;//非递归构建有序二叉树public void insert(Integer value){// 新建一个节点TreeNode newNode = new TreeNode(value);if(root == null){root = newNode;}else{TreeNode current = root;TreeNode parentNode;while(true){parentNode = current;if(newNode.getValue() > current.getValue()){current = current.getRightTreeNode();if(current == null){parentNode.setRightTreeNode(newNode);return;}}else {current = current.getLeftTreeNode();if(current == null){parentNode.setLeftTreeNode(newNode);return;}}}}}//递归构建有序二叉树public TreeNode insert(TreeNode node,Integer value){TreeNode newNode = new TreeNode(value);if(root == null){return root = newNode;}if(newNode.getValue() > node.getValue()){if(node.getRightTreeNode() == null){node.setRightTreeNode(newNode);return root;}return insert(node.getRightTreeNode(),value);}else{if(node.getLeftTreeNode() == null){node.setLeftTreeNode(newNode);return root;}return insert(node.getLeftTreeNode(),value);}}//递归先序遍历public void preOrder(TreeNode node){if(node == null){return;}System.out.println(" "+node.getValue());preOrder(node.getLeftTreeNode());preOrder(node.getRightTreeNode());}//递归中序遍历public void midOrder(TreeNode node){if(node == null){return;}midOrder(node.getLeftTreeNode());System.out.println(" "+node.getValue());midOrder(node.getRightTreeNode());}//递归后序遍历public void lastOrder(TreeNode node){if(node == null){return;}lastOrder(node.getLeftTreeNode());lastOrder(node.getRightTreeNode());System.out.println(" "+node.getValue());}//找到要删除的节点public TreeNode search(TreeNode node,int value){//递归出口if(node == null){return null;}if(node.getValue() == value){return node;}else if(value < node.getValue()){if(node.getLeftTreeNode() == null){return null;}return search(node.getLeftTreeNode(),value);}else {if(node.getRightTreeNode() == null){return null;}return search(node.getRightTreeNode(),value);}}//查找父节点public TreeNode searchParent(TreeNode node,int value){if(node == null){return null;}if(node.getLeftTreeNode() != null && node.getLeftTreeNode().getValue() == value ||(node.getRightTreeNode() !=null && node.getRightTreeNode().getValue() == value)){return node;}else{if(node.getLeftTreeNode() != null && value < node.getValue()){return searchParent(node.getLeftTreeNode(),value);}else if(node.getRightTreeNode() != null && value > node.getValue()){return searchParent(node.getRightTreeNode(),value);}else{return null;}}}//查找右子树中的最小值public int delRightTreeMin(TreeNode node){TreeNode currentNode = node;while(currentNode.getLeftTreeNode() != null){currentNode = currentNode.getLeftTreeNode();}//删除delNode(node,currentNode.getValue());return currentNode.getValue();}//删除public void delNode(TreeNode node,int value){// 判断这棵树是否为空if(node == null){return;}// 找到要删除的节点TreeNode targetNode =  search(node,value);//判断我们找的的这个节点是否为空if(targetNode == null){return;}//找到target节点的父节点TreeNode parent = searchParent(node,value);if(targetNode.getLeftTreeNode() == null && targetNode.getRightTreeNode() == null){ //删除叶子节点//判断targeNode节点是parent节点的左子树还是右子树if(parent.getLeftTreeNode() !=null && parent.getLeftTreeNode().getValue() == value ){parent.setLeftTreeNode(null);}else if(parent.getRightTreeNode() !=null && parent.getRightTreeNode().getValue() == value ){parent.setRightTreeNode(null);}}else if(targetNode.getLeftTreeNode() != null && targetNode.getRightTreeNode() != null){ //有两个子树的节点int MinValue = delRightTreeMin(targetNode.getRightTreeNode());targetNode.setValue(MinValue);}else{ //只有一个子树的情况if(targetNode.getLeftTreeNode() != null){ //判断我们要删除的节点是否有左子节点if(parent.getLeftTreeNode().getValue() == value){ //判断我们要删除的节点是父节点的左子节点parent.setLeftTreeNode(targetNode.getLeftTreeNode());}else {parent.setRightTreeNode(targetNode.getLeftTreeNode());}}else { //判断我们要删除的节点是否有右子节点if(parent.getLeftTreeNode().getValue() == value){ //判断我们要删除的节点是父节点的左子节点parent.setLeftTreeNode(targetNode.getRightTreeNode());}else {parent.setRightTreeNode(targetNode.getRightTreeNode());}}}}//层次遍历public void levelOrder(TreeNode root){if(root == null){return;}LinkedList<TreeNode> queue = new LinkedList<>();TreeNode current = null;queue.offer(root);while (!queue.isEmpty()){current = queue.poll();System.out.println(current.getValue());if(current.getLeftTreeNode() != null){queue.offer(current.getLeftTreeNode());}if(current.getRightTreeNode() != null){queue.offer(current.getRightTreeNode());}}}
}

3、测试类

public class Test {public static void main(String[] args) {TreeNode treeNode = new TreeNode(20);BinaryTree binaryTree = new BinaryTree();binaryTree.insert(12);binaryTree.insert(2);binaryTree.insert(1);binaryTree.insert(10);binaryTree.insert(16);binaryTree.insert(22);binaryTree.insert(34);binaryTree.insert(23);binaryTree.insert(21);binaryTree.insert(0);binaryTree.insert(5);binaryTree.preOrder(binaryTree.root);binaryTree.delNode(binaryTree.root,16);System.out.println("---------------------");binaryTree.levelOrder(binaryTree.root);}
}

4、最后查看输出

java数据结构——树的实现相关推荐

  1. java数据结构树部分(韩顺平版)

    java树 线索化树 package tree;public class treadbinarytree {public static void main(String[] args) {//测试中序 ...

  2. Java数据结构-树状数组

    什么是树状数组?[面试5.0] 使用数组表示多叉树的结构,和优先队列有点类似,区别在于优先队列只表示二叉树 主要用来: 更新数组元素的数值并且求数组前K个元素的总和或平均值 时间复杂度为O(logN) ...

  3. Java数据结构与算法——树(基本概念,很重要)

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 有网友私信我,期待我的下一篇数据结构.非常荣幸文章被认可,也非常感谢你们的监督. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督 ...

  4. 数据结构JAVA实现——树

    数据结构JAVA实现--树 数据结构java实现--树的双亲表示法 数据结构Java实现--树|N叉树之孩子双亲表示法--顺序存储结构+链表 无序二叉树的实现 前序线索二叉树,中序线索二叉树 后续线索 ...

  5. java树结构_Java数据结构:树(Tree)

    计算机科学中的树 在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点组成一个具有 ...

  6. java 数据结构源码--线段树

    线段树模板 package segmentTree;public class SegmentTree {private class Segment { int left; int right; int ...

  7. Java数据结构和算法:哈夫曼树

    本章介绍哈夫曼树.和以往一样,本文会先对哈夫曼树的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若 ...

  8. java队列_如何彻底搞懂 Java 数据结构?CSDN 博文精选

    作者 | 张振华.Jack 责编 | 郭芮 出品 | CSDN 博客 本文和大家一起来重温<Java数据结构>经典之作. Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? ...

  9. java数据结构 队列_Java数据结构与算法[原创]——队列

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本文介绍数据结构中的队列(queue)的概念.存储结构.队列的特点,文末给出ja ...

  10. 数据结构 python的书推荐-java数据结构书一般推荐看什么好?

    想要学习java的各种数据结构,一本良好的书籍会让你受益匪浅,本文就来推荐一些学习java数据结构适合看的书. 一.入门推荐 因为是入门,所以我们先不要求实现,阅读一些通过图片,打比方等通俗易懂的方法 ...

最新文章

  1. 跨平台开发Flutter初体验
  2. C++内存对象大会战
  3. folderutils.java_值得分享的超全文件工具类FileUtil
  4. Linux桌面环境介绍以及优缺点分析
  5. 海南大学计算机调剂要求,海南大学2020年硕士研究生招生调剂的公告
  6. orapwd创建密码文件
  7. 【英语天天读】Man's Youth
  8. 洛谷 刷题 深基部分题解(python版)-2022.01.29
  9. android app源码大全_Android秋招秘籍,看我如何搞定BAT,Vivo,爱奇艺
  10. 多对多的添加修改,显示,的逻辑步骤
  11. 十六进制转换成字符串——CRC
  12. 用标号跳出当前多重嵌套循环是否继续执行循环_在Java中如何跳出当前的多重嵌套循环?...
  13. 开始使用Filebeat
  14. 非负矩阵分解 NMF(Non-negative Matrix Factorization )
  15. springmvc应用-自定义参数解析器
  16. 外卖返利淘宝客小程序公众号淘宝客APP花卷云美团饿了么返利系统
  17. 自定义快捷键整理 - Windows
  18. 普通微型计算机就是多媒体计算机,6-多媒体技术试题
  19. Fate Decision剧本
  20. style-loader 与css-loader 处理 css样式文件

热门文章

  1. cvPyrSegmentation() 图像金字塔分割
  2. 脚本之家python专题_一个简单的python读写文件脚本
  3. delphi与python_Delphi与Python结合之二
  4. jmeter throughput图表_jmeter生成HTML格式性能测试报告
  5. oracle学习(1)--------windows环境下的安装和基本操作
  6. nc windows安装教程
  7. 小甲鱼windows程序设计(50讲)
  8. c语言程序设计项目化教程第二版,c语言程序设计下载
  9. 常见的Java编程思想有哪些
  10. 五招查出想要知道的IP地址