二叉排序树的定义:

二叉排序树满足以下三个性质(BST性质):

<1>若它的左子树非空,则左子树上所有节点的值均小于根节点的值

<2>若它的右子树非空,则右子树上所有节点的值均大于根节点的值

<3>左,右子树本身又各是一棵二叉排序树

根据二叉排序树的BST性质,可以说二叉排序树每个节点上的值(或称关键字)都是唯一的,并且二叉排序树以中序遍历输出的结果必然是一个有序的递增序列。

如下图所示:

用递归方法建立二叉排序树,减少了繁复的比较程序,效率较高。只需要知道每个节点的值,按照递归的方法,首先获取第一个节点的值,然后获取第二个节点的值,将第二个节点与第一个节点进行比较,若小于,则将第二个节点的值放在左子树,若大于,则将第二个节点的值放在右子树,循序渐进,递归每个节点的值,最终建立一棵完整的二叉排序树。

进行二叉排序树查找操作时,传递要查找的值,先与根节点进行比较,若不等于根节点,则根据该查找的值与根节点的大小,递归遍历左子树或者右子树。直到找到该查找值,输出结果。

进行二叉排序树插入操作时,直接将要插入的值用ArrayList链表存入数组,遍历数组,传入新的节点值,继续调用递归方法进行二叉排序树的建立。最终的结果以中序遍历二叉树输出。

代码如下:

package 二叉排序树;import java.util.ArrayList;
import java.util.Scanner;public class SortTree {/*** @author 刘雁冰* @date 2015-02-09 18:32*//** 具备建立搜索二叉树,查找关键字,以及插入新节点功能* * key:关键字,这里可以作为节点的值* l:左子树* r:右子树*/public int key;    public SortTree l;public SortTree r;/** 递归方法建立一棵二叉排序树*/public void bulitTree(int key){//新加入来的节点先与根节点的值进行比较,小于根节点放入左子树,大于根节点放入右子树if(key<this.key){                        if(this.l==null){                    this.l=new SortTree();this.l.key=key;}else//左子树递归建立二叉树this.l.bulitTree(key);}else if(key>this.key){if(this.r==null){this.r=new SortTree();this.r.key=key;}else//右子树递归建立二叉树this.r.bulitTree(key);}}/** 递归寻找关键字,若存在关键字返回提示信息*/public void seach(int key){//先与根节点进行比较,若不等于根节点,则根据该查找的值与根节点的大小,递归遍历左子树或者右子树if(key==this.key)System.out.println("找得到当前值:"+this.key);else if(key<this.key)this.l.seach(key);elsethis.r.seach(key);}public void inorder(){if(this.l!=null)l.inorder();System.out.print(this.key+",");if(this.r!=null)r.inorder();}public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("输入节点,第一个输入的作为二叉树的根节点(输入-1结束输入):");Scanner sc=new Scanner(System.in);ArrayList<Integer>list=new ArrayList<Integer>();int n=sc.nextInt();while(n!=-1){list.add(n);n=sc.nextInt();}int []data=new int[(list.size())];for(int i=0;i<list.size();i++){data[i]=list.get(i);}SortTree st=new SortTree();st.key=data[0];for(int i=1;i<data.length;i++){st.bulitTree(data[i]);}System.out.println("建立的搜索二叉树如下(以中序遍历输出):");st.inorder();System.out.println();System.out.println("输入要进行的操作:");System.out.println("1.查找当前值");System.out.println("2.插入新的节点");int choice=sc.nextInt();switch(choice){case 1:{System.out.println("输入要查找的值:");int k=sc.nextInt();st.seach(k);break;}case 2:{System.out.println("请输入新节点的值(输入-1结束输入):");int m=sc.nextInt();while(m!=-1){list.add(m);m=sc.nextInt();}for(int i=data.length-1;i<list.size();i++){st.bulitTree(list.get(i));}System.out.println("插入新的节点后,二叉搜索树的结果如下(以中序遍历输出):");st.inorder();break;}default:{System.out.println("输入有误");}}}}

调试结果如下:

转载于:https://www.cnblogs.com/luckid/p/4282449.html

java递归方法建立搜索二叉树,具备查找关键字,插入新节点功能相关推荐

  1. 左神算法:调整搜索二叉树中两个错误的节点(Java版)

    本题来自左神<程序员代码面试指南>"调整搜索二叉树中两个错误的节点"题目. 题目 原问题: 一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再 ...

  2. 调整搜索二叉树中两个错误的节点

    一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再是搜索二叉树,请找到这两个错误节点并返回.已知二叉树中所有节点的 值都不一样,给定二叉树的头节点 head,返回一个长度为 ...

  3. 寻找搜索二叉树中两个错误的节点

    题目:一颗二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这颗二叉树不再是搜索二叉树,请找到两个错误节点并返回.已知二叉树中所有节点的值都不一样,给定二叉树的头节点head,返回一个长度为2 ...

  4. Java实现BST:搜索二叉树

    文章目录 数据结构的定义 非递归增加节点 递归增加节点 非递归删除节点 递归删除节点 非递归搜索 递归搜索 先序遍历-递归 中序遍历-递归 后序遍历-递归 先序遍历-非递归 中序遍历-非递归 后序遍历 ...

  5. java怎么自动提示关键词_Eclipse 实现关键字自动补全功能

    一般默认情况下,Eclipse ,MyEclipse 的代码提示功能是比Microsoft Visual Studio的差很多的,主要是Eclipse ,MyEclipse本身有很多选项是默认关闭的, ...

  6. java怎么自动提示关键词_Eclipse 实现关键字自动补全功能 (转)

    一般默认情况下,Eclipse ,MyEclipse 的代码提示功能是比Microsoft Visual Studio的差很多的,主要是Eclipse ,MyEclipse本身有很多选项是默认关闭的, ...

  7. C语言数据结构 单链表的建立、遍历、查找、插入和删除操作

    参考文献 本博文为半摘记性质 -- 声明:全文主干部分摘自 [1] 杨智明. 数据结构(C语言版)[M]. 第一版. 北京:北京理工大学出版社, 2016. [2] 严蔚敏, 李冬梅, 吴伟民. 数据 ...

  8. java的字符串数组添加元素_java 数组中插入新的元素

    class Demo1 { public static void main(String[] args) { /* 5. 有如下歌曲数组 String[] musics = new String[]{ ...

  9. 排序二叉树的创建,插入和查找

    排序二叉树,又称二叉搜索树 其定义如下: 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值: (2)若右子树不空,则右子树上 ...

最新文章

  1. YOLOF 速度和效果均超过YOLOv4的检测模型
  2. 中国小孩为何普遍爱吃洋快餐?[转]
  3. 索引的匹配方式有哪些?
  4. VTK:PolyData之AlignFrames
  5. 关于wpf,datagrid,双向数据绑定用法解决方案
  6. Java程序员应该了解的10个设计原则
  7. 求最大公约数问题(信息学奥赛一本通-T1207)
  8. 一步一步搭建oracle 11gR2 rac+dg之环境准备(二)【转】
  9. @scheduled注解配置时间_「玩转SpringBoot」用好条件相关注解,开启自动配置之门...
  10. 山东大学高频电子线路实验五 混频器实验详解
  11. 使用Python编写打字训练小程序升级版
  12. SourceTree的简单使用 - 变基(rebase)
  13. 基于OSGi的企业级开发框架实践——序篇
  14. 教你九种 JVM GC 问题的排查方法
  15. 华为防火墙配置流量根据链路权重负载分担
  16. ubuntu 调整cpu运行模式至高性能
  17. AirPlay视频SDK集成
  18. 汽车租赁系统(Java)
  19. xheditor使用方法记录
  20. 有哪些软件可以让图片动起来?这些软件你值得拥有

热门文章

  1. Vue报错:3 errors and 0 warnings potentially fixable with the `--fix` option.
  2. Codeforces Round #628 (Div. 2)C - Ehab and Path-etic MEXs
  3. 手机越“清理”越卡顿,清理软件“坑”过你吗?
  4. 20多年的朋友如兄弟,没有矛盾4个人如今都绝交了什么原因?
  5. 如果手里有20万是放银行吃利息还是投资比较合适?
  6. 支付宝借呗频繁借还款对征信有影响吗?
  7. 眼儿媚·迟迟春日弄轻柔 [宋] 朱淑真
  8. 写作新手想少走弯路,尽快赚到钱,必须要知道的
  9. 路由器隔一段时间就上不了网,断一下电又能用了,这是什么原因?
  10. 未来几十年替代手机的是什么产品?