范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Java二叉树查询原理深入分析讲解

  二叉查询树
  概述
  二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分
  特点
  树同时具有数组查询的效率、链表增删、改的性能
  右子树的结点比左子树的节点大
  查找法
  搜索的数字如果比节点大则往右搜索,搜索的数字如果比节点小则往左搜索 结点实现原理
  插入实现原理
  int[] arrs = {5,2,1,4,3,9,7,6,8};  如果树是空树,插入节点就直接放入到根结点如果树不是空树,则插入的数字于根结点的数字进行比较如果插入的值小于于结点的数字,则往左子树插入如果左子结点没有元素就插入到左子结点中如果左子结点有元素,就可以设计一个引用(游标)指向左子节点,并且再次和待插入的执行左子结点进行比较,直到找到插入的位置如果插入的值大于结点的数字,则往右子树插入判断右子结点是否存在值,如果不存在则直接插入判断右子结点是否存在值,如果存在则通过一个引用指向右子结点继续和待插入的值进行比较,直到找到插入的位置
  总结:
  小往左,大往右
  左子数永远小于右子树
  遍历实现原理
  中序遍历:左—根—右
  通过中序遍历就可以将二叉树查找树的进行顺序输出
  总结:
  始终贯彻左—根—右的原则、由内层向外层拆分
  int[] arrs = {1,2,3,4,5,6,7,8,9};  删除实现原理
  提供一个待删除的结点的值,根据值从二叉查找树找到需要删除的结点
  找到待删除结点的父类结点,并且要根据待删除结点在父类结点的左右子树的位置,设置为null进行删除
  需要考虑结点的三种情况
  情况1: 待删除的结点没有子结点
  直接让父类结点的对应目标结点引用设置为null即可
  情况2: 待删除的结点有一个子节点
  将待删除的父类结点对应子节点的引用指向待删除结点的子节点
  情况3: 待删除的结点有两个子节点 从左子树中找到最大的结点进行删除,并且将最大的结点的值放入到待删除结点从右子树中找到最小的结点进行删除,并且将最小的结点的值放入(替换)到待删除结点
  (上述两种删除方法:需要将待删除结点指向新创建(替换后的)的结点,并且将新的结点(替换后的)的左右结点指向待删除的左右子树的结点)
  删除的结点是根节点的情况 情况1:根节点没有子节点,直接将根结点指向null情况2:根结点有一个子节点,则根结点直接指向子节点情况3:根结点有两个子节点
  可以从左子树中找到最大值删除结点,然后将最大值覆盖(替换)根节点
  可以从右子树中找到最小值删除结点,然后将最小值覆盖(替换)根节点
  结点插入与遍历案例 BinarySearchTree类
  package Algorithm; public class BinarySearchTree {     Node root;  //定义根节点     //结点插入方法     public void insert(int value) {         if (root == null) {        //1.如果树是空树,插入节点就直接放入到根结点             root = new Node(value);         } else {     //如果树不是空树,则插入的数字于根结点的数字进行比较             //2.如果插入的值小于于结点的数字,则往左子树插入             Node node = root;     //声明一个游标结点,开始指向根节点             while (true) {       //并且再次和待插入的执行左子结点进行比较,直到找到插入的位置                 if (value < node.value) {      //如果插入的值小于于结点的数字,则往左子树插入                     //2.1如果左子结点没有元素就插入到左子结点中                     if (node.left == null) {                         node.left = new Node(value);                         break;      //如果找到插入的位置,则跳出while循环                     } else {         //如果左子结点有元素,就可以设计一个引用(游标)指向左子节点,并且再次和待插入的执行左子结点进行比较,直到找到插入的位置                         //游标指向左子节点                         node = node.left;                     }                 } else {      //如果插入的值大于结点的数字,则往右子树插入                     //判断右子结点是否存在值,如果不存在则直接插入                     if (node.right == null) {                         node.right = new Node(value);                         break;                     } else {     //判断右子结点是否存在值,如果存在则通过一个引用指向右子结点继续和待插入的值进行比较,直到找到插入的位置                         //游标指向右子节点                         node = node.right;                     }                 }             }         }     }     //定义左右结点常量     public static final int LEFT = 0; //左子节点     public static final int RIGHT = 1; //右子节点     //结点查找方法     public void deleteNode(int value) {         //定义游标从根节点开始查询         Node node = root;         //定义目标结点         Node target = null;         //定义目标结点的父类结点         Node parent = null;         //目标结点的类型为,左子节点或者右子节点         int nodeType = 0; //0代表左子节点 1代表右子节点           while (node != null) { //游标不为空,如果为空则没有子节点,无法删除             if (node.value == value) { //如果目标结点的值和需要删除结点的值相同                 //找到结点                 target = node;                 break;             } else if (value < node.value) {    //如果值不同,则判断目标结点值是否小于node结点                 //保存父类结点                 parent = node;                 //游标指向左子节点                 node = node.left;                 nodeType = LEFT;             } else { //如果值不同,且目标结点值大于node结点                 //保存父类结点                 parent = node;                 //游标指向右子节点                 node = node.right;                 nodeType = RIGHT;             }         }         //如果没找到需要删除的目标结点         if (target==null){             System.out.println("没有找到要删除的结点");             return;         }         //删除结点的三种情况         if (target.left == null && target.right == null) {   //情况1:待删除的结点没有子结点               if (parent==null){      //删除的结点没有子结点                 //将root设置为null即可                 root=null;                 return;             }             //判断目标的结点是左子节点还是右子节点             if (nodeType == LEFT) {                 //将父类的左子节点设置为null                 parent.left = null;             } else {                 //将父类的右子节点设置为null                 parent.right = null;             }         } else if (target.left != null && target.right != null) {   //情况2:待删除的结点有2个子节点             //两个子节点,从target右子树查找最小的值             Node min=target.right;             //遍历左子树             while (min.left!=null){                 min = min.left;             }             //将最小的结点进行删除             deleteNode(min.value);             //将待删除的结点替换成最小的结点的值             target.value= min.value;         }else { //情况3:待删除的结点有1个子节点             //删除结点是根节点             if (parent==null){                 if (target.left!=null){ //判断是左子节点还是右子节点有值                     root=target.left;   //根节点=目标左子结点                 }else {                     root=target.right;  //根节点=目标右子结点                 }             }             //只有一个子节点             if (nodeType==LEFT){    //如果是左子节点                 if (target.left!=null){                     //将父类的左子节点,指向待删除结点的左子节点                     parent.left=target.left;                 }else { //如果是右子节点                     //将父类的左子节点,指向待删除结点的右子节点                     parent.left=target.right;                 }             }else {                 if (target.right!=null){                     //将父类的右子节点,指向待删除结点的左子节点                     parent.right=target.left;                 }else { //如果是右子节点                     //将父类的右子节点,指向待删除结点的右子节点                     parent.right=target.right;                 }             }         }     }     //实现中序遍历     public void midTraversal(Node node) {         if (node == null) {  //进行判断结点不能为空,如果为空则退出             return;         } else {     //如果结点不为null,则执行下列遍历语句             //首先,遍历左节点             midTraversal(node.left);             //打印根节点             System.out.print(node.value + ",");             //最后遍历右子结点             midTraversal(node.right);         }     }     //创建一个结点类     public static class Node {         int value;  //存储值         Node left;  //左子树         Node right; //右子树         // 带参构造方法,传入value赋值         public Node(int value) {             this.value = value;         }     } }TestBST测试类package Algorithm; public class TestBST {     public static void main(String[] args) {         int[] arrs = {5, 2, 1, 4, 3, 9, 7, 6, 8};         //创建二叉查询树         BinarySearchTree tree = new BinarySearchTree();         //将数组中的元素构造成二叉查询树         for (int i = 0; i < arrs.length; i++) {             tree.insert(arrs[i]);         }         //删除结点         tree.deleteNode(20);         //中序遍历根结点         tree.midTraversal(tree.root);     } }

苹果汽车再获新专利涉及侧滑门展开式天窗据外媒报道,美国专利商标局(U。S。PatentandTrademarkOffice)授予了苹果公司两项新泰坦项目(ProjectTitan)专利,涉及侧滑门展开式天窗和加固车窗。威海建设集团举行庆祝成立70周年表彰盛典9月23日,威海建设集团成立70周年表彰盛典举行,威建集团公司总经理林宁宣读表彰决定,威建集团公司党委书记董事长李刚致辞。李刚指出,过去的70年,是威建集团艰苦创业跨越发展的70年建设五大家园打造五大家园筑强战斗堡垒临朐农商银行小微贷中心党支部现有员工12人,党员6名。该支部创建朐城快贷支部品牌和服务品牌,围绕33231思路打造五大家园,为业务发展凝聚强大动力。截至8月末,各项存款1。15亿元欧盟未来会如何?俄乌冲突后,欧盟的前景还好吗?我们先看个新闻,9月22日,商务部新闻发布会上,发言人介绍了今年1至8月,欧盟对华投资增长123。7(含通过自由港投资数据)。这充分表明,包括欧盟在内全球可再生能源工作岗位达到1270万,中国占42国际可再生能源署最新发布的报告显示,尽管疫情的影响持续发酵,能源危机日益严重,但2021年全球可再生能源工作岗位达到1270万,一年内增加了70万。太阳能是发展最快的行业,在202安踏凭啥超越阿迪耐克,甩了李宁两个特步的距离?原因在这近年来,在国潮热经济环境下,并伴随着新疆棉事件鸿星尔克捐款的推动,国产运动品牌成为了人们津津乐道的对象。虽然都是自家兄弟,也难免有些暗自较劲,关于国产运动品牌一哥的宝座之争,从未停02!姆巴佩浪费单刀,法国输掉12亿巅峰对决,被世界第10双杀北京时间9月26日凌晨,2122赛季欧国联小组赛第6轮打响,A1组焦点战,丹麦坐镇主场迎战法国。上半场,多尔贝里和奥尔森连进2球,下半场姆巴佩错失单刀,法国队02完败。世界杯冠军遭为什么巴菲特投资比亚迪可以暴赚几十倍,你却深套?点赞了的2022发财,关注的年年发大财!本文是价值事务所的原创文章第1076篇。文章仅记录价值事务所思想,不构成投资建议,作者没有群不收费荐股不代客理财。都知道医疗是极好的赛道,各神回复不考虑薪水和面子,你最想做什么工作?神评全国统一啊还是南方的蜻蜓更加壮观呢。说明你们两个还是挺有缘分在一起的。每个人都会有严肃的时候,只是你没看到他微笑的时候。因为小猪也知道报恩的呢,给它们点一个赞吧!看来鞋子里有暗器,这个太恐怖我国新疆奇台射电110米口径望远镜奠基开工2022年9月23日,新疆天文台110米口径全向可动射电望远镜项目在昌吉回族自治州奇台县奠基开工。由于这台射电望远镜建在奇台,按照惯例它被称作奇台射电望远镜,缩写为QTT(QiTa我国好评如潮的四大美食,名声很大却褒贬不一,你都吃过吗?我国自古以来就是包罗万象,那么我国特色的小吃就是最好的体现,民间智慧的凝结也是中国美食不可或缺的一部分。好多人对这些小吃的印象就是除了三餐之外的加餐,但事实并非如此,它们的存在更像
三国战略游戏怎样设计才真实?如果是你来开发,还要增加哪些要素还要增加的要素有一坚决限制征兵额度。虽然313在这些方面有所改变。但如果是我来开发,首先就要杜绝一城挑天下的情况。比如一个城有人口10万人,那么顶天就只能征1万兵。或者说你一定要强超击突破超级人类卡顿怎么办,卡顿丢包解决方法超击突破超级人类继上一次测试之后,抢先体验版现在也即将在Steam上上线,但是在上次测试的时候就有很多玩家反馈在游戏中遇到了卡顿和丢包的问题,大家或许在这次抢先体验版上线的时候也会NH达成大满贯,TMA躺进世界赛,4AM完成自己的目标本来以为最后一局会有悬念,可惜17战队亲手送走自己的机会,最终由NH拿下PCS7洲际冠军,PCL赛区也是完成了七连冠,这应该是韩国赛区离洲际赛冠军最近的一次,但是BGP后面的打法太LOLS12小组赛杰克爱德莱文惨遭军训,DRX打穿下路击败TESLOLS12小组赛杰克埃德温遭遇军训,DRX客场击败TES。北京时间10月10日上午1030,2022全球总决赛小组赛第三天最后一战,二号种子LPL的TES将对阵四号种子LCK的DLPL选手全球总决赛数据记录2022电竞季英雄联盟超话全球总决赛小组赛已经开始。此次参赛的四支LPL战队中,既有世界赛的新人,将会书写属于自己的故事,也有里程碑数据的领头羊,他们依然在刷新着自己的传奇。今年的王者荣耀娜可露露终于迎来加强,后羿伤害提升,海月玩家笑了王者荣耀进入S29赛季已经有一段时间了,但是不少玩家的段位不升反而还降低了不少,纷纷吐槽上分难,甚至有玩家说本赛季英雄的平衡度调整的不好,其实本赛季剩余的时间还长,调整好的自己的心梦幻西游一级卡片售价5W?梦幻西游变身卡体系下的致富之道梦幻西游变身卡系统自推出以来一直就深受玩家欢迎,不少小伙伴都会在各类活动中准备对应的卡片,这些游戏习惯也使得变身卡成为了不少商人的致富之路。下面,就给大家普及一下其中的奥秘吧!一低风流倜傥的杜海涛错爱吴昕,妻子沈梦辰只是替代品杜海涛,那个沈梦辰爱了九年的男人,那个一直在快乐大本营节目中充当憨厚老实一角,那个快乐家族成员口中的涛涛。他的人生可谓事业爱情尽收入囊中,但三十年河东三十年河西,谁的人生历程都不可橘柚蜜桃褶皱女神裙在PANTONE彩通色彩机构发布2023春夏季纽约时装周十大最受欢迎流行色中PeachPink桃粉(PANTONE151530TPX)和Tangelo橘柚(PANTONE15133儿子抗日牺牲,母亲悲痛欲绝,17年后军区司令来信请娘来北京1949年11月的一天,华夏大地大部分地方已经进入严冬,湖北省黄安县大徐家村发生了这样一件事,一个小伙子说自己是北京的徐深吉司令派来接他母亲进京享福的人,要找徐司令的母亲石顺香。村老师,他不是我爷爷,他是我爸爸老师,他不是我爷爷他是我爸爸近日,云南文山一位民警休假期间第一次送3岁的儿子去幼儿园因为满头白发被老师误以为是孩子的爷爷云南文山边境管理支队缉毒民警雷鸣(化名)其实不老今年只有37