当前位置: 首页 > news >正文

萧山网站建设安徽省建设工程资源网

萧山网站建设,安徽省建设工程资源网,南宁建网站必荐云尚网络,同一个阿里云可以做两个网站1.先看一个需求 给你一个数列 (7, 3, 10, 12, 5, 1, 9)#xff0c;要求能够高效的完成对数据的查询和添加 2.解决方案分析 使用数组 数组未排序#xff0c; 优点#xff1a;直接在数组尾添加#xff0c;速度快。 缺点#xff1a;查找速度慢. [示意图] 数组排序#xf…1.先看一个需求 给你一个数列 (7, 3, 10, 12, 5, 1, 9)要求能够高效的完成对数据的查询和添加 2.解决方案分析 使用数组 数组未排序 优点直接在数组尾添加速度快。 缺点查找速度慢. [示意图] 数组排序优点可以使用二分查找查找速度快缺点为了保证数组有序在添加新数据时找到插入位 置后后面的数据需整体移动速度慢。[示意图] 使用链式存储-链表 不管链表是否有序查找速度都慢添加数据速度比数组快不需要数据整体移动。[示意图] 使用二叉排序树 3.二叉排序树介绍 二叉排序树BST: (Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点要求左子节点的值比当 前节点的值小右子节点的值比当前节点的值大。 特别说明如果有相同的值可以将该节点放在左子节点或右子节点 比如针对前面的数据 (7, 3, 10, 12, 5, 1, 9) 对应的二叉排序树为 4.二叉排序树创建和遍历 一个数组创建成对应的二叉排序树并使用中序遍历二叉排序树比如: 数组为 Array(7, 3, 10, 12, 5, 1, 9) 创 建成对应的二叉排序树为 5.二叉排序树的删除 二叉排序树的删除情况比较复杂有下面三种情况需要考虑 删除叶子节点 (比如2, 5, 9, 12)删除只有一颗子树的节点 (比如1)删除有两颗子树的节点. (比如7, 310 )操作的思路分析 //对删除结点的各种情况的思路分析: 第一种情况: 删除叶子节点 (比如2, 5, 9, 12) 思路 (1) 需求先去找到要删除的结点 targetNode (2) 找到 targetNode 的 父结点 parent (3) 确定 targetNode 是 parent 的左子结点 还是右子结点 (4) 根据前面的情况来对应删除 左子结点 parent.left null 右子结点 parent.right null; 第二种情况: 删除只有一颗子树的节点 比如 1 思路 (1) 需求先去找到要删除的结点 targetNode (2) 找到 targetNode 的 父结点 parent (3) 确定 targetNode 的子结点是左子结点还是右子结点 (4) targetNode 是 parent 的左子结点还是右子结点 (5) 如果 targetNode 有左子结点 5. 1 如果 targetNode 是 parent 的左子结点 parent.left targetNode.left; 5.2 如果 targetNode 是 parent 的右子结点 parent.right targetNode.left; (6) 如果 targetNode 有右子结点 6.1 如果 targetNode 是 parent 的左子结点 parent.left targetNode.right; 6.2 如果 targetNode 是 parent 的右子结点 parent.right targetNode.right 情况三 删除有两颗子树的节点. (比如7, 310 ) 思路 (1) 需求先去找到要删除的结点 targetNode (2) 找到 targetNode 的 父结点 parent (3) 从 targetNode 的右子树找到最小的结点 (4) 用一个临时变量将 最小结点的值保存 temp 11 (5) 删除该最小结点 (6) targetNode.value temp 6.二叉排序树删除结点的代码实现: public class BinarySortTreeDemo {public static void main(String[] args) {// TODO Auto-generated method stubint arr[] { 7, 3, 10, 12, 5, 1, 9, 2 };BinarySortTree binarySortTree new BinarySortTree();// 循环的添加结点到二叉树for (int i 0; i arr.length; i) {binarySortTree.add(new Node(arr[i]));}// 中序遍历二叉排序树System.out.println(中序遍历二叉排序树);binarySortTree.infixOrder();// 1,3,5,7,9,10,12// 测试一下删除叶子节点 // binarySortTree.delNode(2); // binarySortTree.delNode(1);binarySortTree.delNode(7);System.out.println(删除结点后);binarySortTree.infixOrder();}}//创建二叉排序树 class BinarySortTree {private Node root;// 查找要删除的结点public Node search(int value) {if (root null) {return null;} else {return root.search(value);}}// 查找父结点public Node searchParent(int value) {if (root null) {return null;} else {return root.searchParent(value);}}// 编写方法// 1.返回以node为根节点的二叉排序树的最小节点的值// 2.删除以node为根节点的二叉排序树的最小节点的值/*** * param node 传入的结点当作二叉排序树的根节点* return 返回的以node为结点的二叉树的最小结点的值*/public int delRightTreeMin(Node node) {Node target node;// 循环的查找左节点就会找到最小值while (target.left ! null) {target target.left;}// 这时target就指向了最小节点// 删除最小节点delNode(target.value);return target.value;}// 删除结点public void delNode(int value) {if (root null) {return;} else {// 1.需要先去找到要删除的结点 targetNodeNode targetNode search(value);// 如果没有找到要删除的结点if (targetNode null) {return;}// 如果我们发现targetNode没有父结点if (root.left null root.right null) {root null;return;}// 去查找targetNode的父结点Node parent searchParent(value);// 如果要删除的节点是叶子节点if (targetNode.left null targetNode.right null) {// 判断targetNode是父结点的左指结点还是右子节点if (parent.left ! null parent.left.value value) {// 是左指结点parent.left null;} else if (parent.right ! null parent.right.value value) {// 是右子结点parent.right null;}} else if (targetNode.left ! null targetNode.right ! null) {// 删除有两颗子树的节点int minVal delRightTreeMin(targetNode.right);targetNode.value minVal;} else {// 删除只有一颗子树的结点// 如果要删除的结点有左指结点if (targetNode.left ! null) {// 如果targetNode是parent的左指结点if (parent.left.value value) {parent.left targetNode.left;} else {// targetNode是parent的右子结点parent.right targetNode.left;}} else {// 如果要删除的节点有右子结点// 如果targetNode是parent的左指结点if (parent.left.value value) {parent.left targetNode.right;} else {// 如果targetNode是parent的右指结点parent.right targetNode.right;}}}}}// 添加结点方法public void add(Node node) {if (root null) {root node;// 如果root为空则直接让root指向node} else {root.add(node);}}// 中序遍历public void infixOrder() {if (root ! null) {root.infixOrder();} else {System.out.println(二叉排序树为空不能遍历);}} }//创建Node结点 class Node {int value;Node left;Node right;public Node(int value) {super();this.value value;}// 查找要删除的结点/*** * param value 希望删除的结点的值* return 如果找到返回该节点否则返回null*/public Node search(int value) {if (value this.value) {return this;} else if (value this.value) {// 如果查找的值小于当前节点向左子树递归查找// 如果左子结点为空if (this.left null) {return null;}return this.left.search(value);} else {// 如果查找的值不小于当前节点向右子树递归查找if (this.right null) {return null;}return this.right.search(value);}}// 查找要删除该节点的父节点/*** * param 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 (value this.value this.left ! null) {return this.left.searchParent(value);// 向左子树递归查找} else if (value this.value this.right ! null) {return this.right.searchParent(value);// 向右子树递归查找} else {return null;// 没有找到父结点}}}Overridepublic String toString() {return Node [value value ];}// 添加结点方法// 递归的方式添加结点需要满足二叉排序树的要求public void add(Node node) {if (node null) {return;}// 判断传入结点的值和当前子树的根结点的值关系if (node.value this.value) {// 如果当前节点左子节点为nullif (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();}} }
http://www.dnsts.com.cn/news/189099.html

相关文章:

  • 怎么建网站快捷方式网页版百度
  • 浅谈电子商务网站的建设与管理眉山 网站开发
  • 企业网站开发标准学编程哪家培训机构好
  • 河南建设厅网站地址湖南人文科技学院招聘
  • 广告网站留电话不用验证码网站服务器架设
  • 苏州建筑行业网站建设深圳网页设计公司排行
  • 网站死链接wordpress按钮打开外部链接
  • 乡镇信息公开网站建设制度西安米德建站
  • 做网站如何保证询盘数量电商网站的好处
  • 做相框的网站设计之家房屋装修游戏破解版
  • 怎么建设网站赚钱手机杭州哪里找网站建设的兼职
  • 福州天成设计我的企业网站怎么seo
  • 保定网站建设方案学做软件的网站有哪些内容
  • 做盗版电影网站赚钱iis两个网站做ssl
  • wordpress 整站采集高端网站建设企业
  • 移动网站开发面试题网站底色什么颜色好看
  • 嘉兴快速建站模板软件外包网站
  • wordpress是动态国外seo查询
  • 利州区住房和城乡建设部网站竞价网
  • 建网站的经历怎样做网站宣传
  • 网站 文件注入网站内部链接如何进行优化建设
  • 北京网站建设 和君网站主目录权限配置
  • logo商标设计网站兰州起点网站建设公司
  • 在线咨询网站模板长沙网站seo源头厂家
  • 工信部网站原来是软件开发外包服务
  • 网站备案负责人照片著名的国外设计网站
  • 漂亮网站首页 html遵化市城乡建设规划局网站
  • 深圳响应样式网站建设费用网站推广专员的岗位职责是什么
  • 网站企业地图天体摄影
  • 南京网站制作步骤东莞培训网站建设