一、采用存储结构

  1、顺序存储:采用数组,顺序存储适配于完全二叉树,对于非完全二叉树并不合适,主要体现在空间上的浪费,所以我们需要用到另一种存储方式——链式存储。

  2、链式存储:数据data用键值对的形式表示

    

二、建立二叉树

//自己建一个Node类,树有Node对象组成
private class Node{
private Key key; //键
private Value val; //值
private Node left,right; //左右子树
private int N; //结点计数器
public Node(Key key,Value val,int N) {
this.key = key;
this.val = val;
this.N = N;
}
}
变量N给出了以该节点为根的子树的结点总数

三、二叉查找树的查、插、删、遍历

package BSTree;

public class BST_1 <Key extends Comparable<Key>,Value>{
private Node root;//二叉查找树的根
private class Node{
private Key key;
private Value value;
private Node lchild,rchild;
private int N; //以该节点为根的子树中的结点个数
//构造方法
public Node(Key key,Value value,int N) {
this.key = key;
this.value =value;
this.N = N;
}
@Override
public String toString() {
return "Node [key=" + key + ", value=" + value + ", N=" + N + "]";
} } //获取节点个数N
public int size() {
return size(root);
}
private int size(Node x) {
if(x==null) return 0;
return x.N;
}
//通过Key查找Value
public Value search(Key key) {
return search(root,key);
}
private Value search(Node x,Key key) {
//找不到,返回null
if(x==null) return null;
//如果不为空,用待查找的值与当前根节点的值进行比较
int result = key.compareTo(x.key);//返回一个整数,大于或小于或等于0
if(result>0)
return search(x.rchild, key);//大于,往右子树递归查
else if(result<0)
return search(x.lchild, key);
else
return x.value;
}
//插入
public void insert(Key key,Value value){
root = insert(root,key,value);
}
private Node insert(Node x, Key key, Value value) {
//如果key已经存在,则修改value为新的value值,不存在,则创建一个新的结点
if(x==null) return new Node(key, value, 1);
int result = key.compareTo(x.key);
if(result>0)
x.rchild = insert(x.rchild, key, value);
else if(result<0)
x.lchild = insert(x.lchild, key, value);
else
x.value = value;
x.N = size(x.rchild)+size(x.rchild)+1;
return x;
}
//查找最小键
public Key min() {
return min(root).key;
}
private Node min(Node x) {
if(x.lchild==null) return x;
else return min(x.lchild);
}
//二叉查找树中最难的就是删除,先从删最简单的最小结点开始
public void deleteMin() {
root = deleteMin(root);
}
//返回已经删了最小结点的根节点
private Node deleteMin(Node x) {
//在找到最小结点时x时,x=x.right
if(x.lchild==null) return x.rchild;
x.lchild = deleteMin(x.lchild);
x.N = size(x.rchild)+size(x.rchild)+1;
return x;
}
/**删除任意节点
* 1.如果树为null或者找不到key,返回null
* 2.否则,通过比较找到键Key的结点:
* 如果该结点没有右子树 ,只有左子树 x = x.left
* 如果该结点没有左子树 ,只有有子树x = x.right
* 该结点左右子树都有,先用Node t = x 存x结点,
* 找到以t.right为根节点的树的最小键, 赋予x: x = min(x.right),及替换x结点
* 然后把这个最小键删了,把t结点的左子树赋予x.left
* 3.返回 返回已经删了结点的根节点
*
*/
public void delete(Key key) {
root = delete(root,key);
}
private Node delete(Node x, Key key) {
if(x==null) return null;
int result = key.compareTo(x.key);
if(result>0) x.rchild = delete(x.rchild, key);
else if(result<0) x.lchild = delete(x.lchild, key);
else {
if(x.rchild==null) return x.lchild;
if(x.lchild==null) return x.rchild;
Node t = x;
x = min(t.rchild);
x.rchild = deleteMin(t.rchild);
x.lchild = t.lchild;
}
x.N = size(x.lchild)+size(x.rchild)+1;
return x;
} //前序遍历:根--左子树--右子树
public void preOrder() {
preOrder(root);
}
private void preOrder(Node x) {
if(x!=null) {
System.out.print("["+x.key+":"+x.value+"]"+" ");
preOrder(x.lchild);
preOrder(x.rchild);
}
}
//中序遍历:左子树--根节点--右子树
public void inOrder() {
inOrder(root);
}
private void inOrder(Node x) {
if(x!=null) {
inOrder(x.lchild);
System.out.print("["+x.key+":"+x.value+"]"+" ");
inOrder(x.rchild);
}
}
//后序遍历:左子树--右子树--根节点
public void postOrder() {
postOrder(root);
}
private void postOrder(Node x) {
if(x!=null) {
postOrder(x.lchild);
postOrder(x.rchild);
System.out.print("["+x.key+":"+x.value+"]"+" ");
}
} }

java实现二叉树的建立以及实现二叉查找树的查、插、删、遍历的更多相关文章

  1. Java实现二叉树及相关遍历方式

    Java实现二叉树及相关遍历方式 在计算机科学中.二叉树是每一个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(r ...

  2. 数据结构——Java实现二叉树

    相关概念 存储结构: 顺序存储结构:二叉树的顺序存储结构适用于完全二叉树,对完全二叉树进行顺序编号,通过二叉树的性质五(第1个结点为根结点,第i个结点的左孩子为第2i个结点,右孩子为第2i+1个结点) ...

  3. 使用Java实现二叉树的添加,删除,获取以及遍历

    一段来自百度百科的对二叉树的解释: 在计算机科学中,二叉树是每个结点最多有两个子树的树结构.通常子树被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用 ...

  4. 二叉树的建立&&前中后遍历(递归实现)&&层次遍历

    下面代码包含了二叉树的建立过程,以及三种遍历方法了递归实现,代码中还利用队列实现了层次遍历. import java.util.LinkedList; import java.util.Queue; ...

  5. Android JNI之JAVA与C++对象建立对称关联(JNI优化设计,确保JNI调用的稳定性)

    转载请声明:原文转自:http://www.cnblogs.com/xiezie/p/5930503.html Android JNI之JAVA与C++对象建立对称关联 1.JAVA对象持有C++对象 ...

  6. C语言二叉树的建立与遍历

    二叉树的建立和遍历都要用到递归,先暂时保存一下代码,其中主要是理解递归的思想,其它的就都好理解了.这里是三种遍历方式,其实理解一种,其它的几个就都理解了,就是打印出来的顺序不一样而已.建立和遍历的方式 ...

  7. C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历、中序遍历、后续遍历)

    树 利用顺序存储和链式存储的特点,可以实现树的存储结构的表示,具体表示法有很多种. 1)双亲表示法:在每个结点中,附设一个指示器指示其双亲结点在数组中的位置. 2)孩子表示法:把每个结点的孩子排列起来 ...

  8. Java实现二叉树的前序、中序、后序遍历(非递归方法)

      在上一篇博客中,实现了Java中二叉树的三种遍历方式的递归实现,接下来,在此实现Java中非递归实现二叉树的前序.中序.后序遍历,在非递归实现中,借助了栈来帮助实现遍历.前序和中序比较类似,也简单 ...

  9. 二叉树的建立以及遍历的多种实现(python版)

    二叉树是很重要的数据结构,在面试还是日常开发中都是很重要的角色. 首先是建立树的过程,对比C或是C++的实现来讲,其涉及到了较为复杂的指针操作,但是在面向对象的语言中,就不需要考虑指针, 内存等.首先 ...

随机推荐

  1. "=="和 equals 方法究竟有什么区别?

    "=="和 equals 方法究竟有什么区别? ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同, 要比较两个基本类型的数据或两个引 ...

  2. webmagic保存数据

    使用多线程:

  3. Windows服务器上使用phpstudy部署PHP程序

    一.下载并安装PHPStudy 官网地址:http://phpstudy.php.cn/(安装包下载地址:链接:https://pan.baidu.com/s/1WOmbOwmLuUPt3_nmY6- ...

  4. Virtual DOM 系列二:核心API

    为了更好的研究Virtual DOM,我选择了snabbdom来学习.相比Vue来说,snabbdom对于研究虚拟DOM更好,因为它里面没有其他干扰的东西,而且源码也比较少,因此研究起来更方便. 1. ...

  5. 深度解读Tomcat中的NIO模型(转载)

    转自https://www.jianshu.com/p/76ff17bc6dea 一.I/O复用模型解读 Tomcat的NIO是基于I/O复用来实现的.对这点一定要清楚,不然我们的讨论就不在一个逻辑线 ...

  6. ueditor 回显html样式会直接出来,无效

    百度了好久,后面发现可以直接这样

  7. 第一章 Python基本语法元素

    1.1   程序设计基本方法 计算机的概念: (1)功能性:对数据的操作,表现为数据计算.输出输出处理和结果存储等 (2)可编程性:根据一系列指令自动地.可预测地.准确地完成操作者的意图. 计算机的发 ...

  8. ftp服务器安装与配置

    ftp服务器安装与配置 1. ftp服务端的安装 1 如果之前配置过ftp服务器的还是之后配置的服务器,无法启动服务,那么基本是配置出现了错误,那么可先完全卸载后再进行安装.如果无法定位多半是镜像源的 ...

  9. 「NOIp2018」 游记

    作为一个蒟蒻要去考tg了,心理还是有点慌的.初赛70,心惊胆战很长时间,后来降分到68了,居然卡线了(震惊……) $Day \ 0$ 今天请假在家复习了,打了几个数据结构模板.希望明天考场能++rp啊 ...

  10. 通过10046 event来获取真实的执行计划

    获取SQL执行计划的方式有很多,但是某些时候获取的SQL执行计划并不是准确的,只有在SQL真实执行之后获取到的SQL PLAN才是真实准确的,其他方式(如,explain plan)获取到的执行计划都 ...