一、采用存储结构

  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. Elastic Stack-Elasticsearch使用介绍(四)

    一.前言     上一篇说了一下查询和存储机制,接下来我们主要来说一下排序.聚合.分页: 写完文章以后发现之前文章没有介绍Coordinating Node,这个地方补充说明下Coordinating ...

  2. VMware Workstation14 安装Ubuntu18.04

    1 下载Vmware Workstations14破解版 百度网盘链接:https://pan.baidu.com/s/12yVxoPCJUAmdts4SUdzndg 提取码:bs0g 2 下载Ubu ...

  3. 优先队列Priority Queue和堆Heap

    对COMP20003中的Priority queue部分进行总结.图片来自于COMP20003 queue队列,顾名思义特点先进先出 priority queue优先队列,出来的顺序按照优先级prio ...

  4. git和github的学习

    摘要:Git是个实用而流行的工具,我在网上找了很多教程,发现很多扯来扯去的,难消化,难吸收,而廖雪峰老师的这个教程最好,由浅入深,一步一步跟着做,记录巩固下.原作网址:https://www.liao ...

  5. python爬取某站上海租房图片

    前言 对于一个net开发这爬虫真真的以前没有写过.这段时间开始学习python爬虫,今天周末无聊写了一段代码爬取上海租房图片,其实很简短就是利用爬虫的第三方库Requests与BeautifulSou ...

  6. HDU 2586 How far way?

    传送门 继续水板子题... #include <bits/stdc++.h> using namespace std; inline int read() { , f = ; char c ...

  7. GIt帮助文档之忽略某些文件——忽略python虚拟环境文件夹(转)

    前言:为避免多个Python项目下安装库之间的冲突,或为轻松打包某个项目,建议在每个项目文件夹下安装Python虚拟环境,并在虚拟环境内进行操作,之后你安装的任何库和执行的任何程序都是在这个环境下运行 ...

  8. 本部jdk切换的坑!!!

    https://www.cnblogs.com/ll409546297/p/6593173.html 如果你参考其他博主没有解决,可以来参考下这个. 1.我们打开注册表,然后找到这个路径: HKEY_ ...

  9. Flask 构建微电影视频网站(八)

    评论收藏及弹幕 实现电影评论添加及列表.数据查询实现统计播放量和评论量.jquery ajax实现收藏电影,flask结合redis消息队列实现电影弹幕,bug处理等功能. 电影评论-统计 class ...

  10. DRF 商城项目 - 购物( 购物车, 订单, 支付 )逻辑梳理

    购物车 购物车模型 购物车中的数据不应该重复. 即对相同商品的增加应该是对购买数量的处理而不是增加一条记录 因此对此进行联合唯一索引, 但是也因此存在一些问题 class ShoppingCart(m ...