一、采用存储结构

  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. 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading)

    前言 接下来会陆续详细讲解EF Core 2.1新特性,本节我们来讲讲EF Core 2.1新特性延迟加载,如果您用过EF 6.x就知道滥用延迟加载所带来的灾难,同时呢,对此深知的童鞋到了EF Cor ...

  2. 定时任务调度工作(学习记录 二)timer定时函数的用法

    schedule的四种用法: 1.schedule(task,time) 参数: task----所安排的任务 time----执行任务的时间 作用: 在时间等于或超过time的时候执行且仅执行一次t ...

  3. Python基础:第一个Python程序(2)

    1.Python Shell 1.1 Windows命令 (1)[开始]|[运行],输入cmd回车,进入Windows命令界面. (2)输入python,回车,进入Python Shell. 1.2 ...

  4. HDU 6468 zyb的面试

    http://acm.hdu.edu.cn/showproblem.php?pid=6468 题目 今天zyb参加一场面试,面试官听说zyb是ACMer之后立马抛出了一道算法题给zyb:有一个序列,是 ...

  5. consul 剔除node_exporter的脚本

    #!/bin/bash clear echo "node_exporter注销工具" read -p "请输入要踢掉的节点IP,如果有多个IP,请使用英文格式 ',' 隔 ...

  6. 哈尔滨工程大学第十四届程序设计竞赛(同步赛)F 小帆帆走迷宫(dp)

    题目描述 小帆帆被困在一个 NxN 的方格矩阵迷宫,每个格子中都有一个整数 A[i][j].小帆帆从迷宫起点(左上角)格子 A[1][1]开始走,每一步可以向右或向下移动,目标是移动到迷宫的出口右下角 ...

  7. laravel 读写分离源码解析

    前言:上一篇我们说了<laravel 配置MySQL读写分离>,这次我们说下,laravel的底层代码是怎样实现读写分离的.   一.实现原理 说明: 1.根据 database.php ...

  8. PHP 消息队列 详解

    前言:之前做过的一些项目中有时候会接触到消息队列,但是对消息队列并没有一个很清楚的认知,本篇文章将会详细分析和归纳一些笔记,以供后续学习. 一.消息对列概念 从本质上说消息对列就是一个队列结构的中间件 ...

  9. Ubuntu18.04关机卡死问题

    直接进入正题!你的电脑卡死说明带有独显!而Ubuntu默认是不给你的显卡装驱动的,那这就导致关机卡死的问题.按住键盘Ctrl+Alt+T打开终端,输入下面的命令 software-properties ...

  10. 金蝶K3 wise 插件二次开发与配置

    金蝶K3 wise 插件二次开发与配置 开发环境:K/3 Wise 13.0.K/3 Bos开发平台.Visual Basic 6.0 目录 一.二次开发插件编程二.代码演示三.配置插件四.测试插件五 ...