java实现二叉树的建立以及实现二叉查找树的查、插、删、遍历
一、采用存储结构
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实现二叉树的建立以及实现二叉查找树的查、插、删、遍历的更多相关文章
- Java实现二叉树及相关遍历方式
Java实现二叉树及相关遍历方式 在计算机科学中.二叉树是每一个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(r ...
- 数据结构——Java实现二叉树
相关概念 存储结构: 顺序存储结构:二叉树的顺序存储结构适用于完全二叉树,对完全二叉树进行顺序编号,通过二叉树的性质五(第1个结点为根结点,第i个结点的左孩子为第2i个结点,右孩子为第2i+1个结点) ...
- 使用Java实现二叉树的添加,删除,获取以及遍历
一段来自百度百科的对二叉树的解释: 在计算机科学中,二叉树是每个结点最多有两个子树的树结构.通常子树被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用 ...
- 二叉树的建立&&前中后遍历(递归实现)&&层次遍历
下面代码包含了二叉树的建立过程,以及三种遍历方法了递归实现,代码中还利用队列实现了层次遍历. import java.util.LinkedList; import java.util.Queue; ...
- Android JNI之JAVA与C++对象建立对称关联(JNI优化设计,确保JNI调用的稳定性)
转载请声明:原文转自:http://www.cnblogs.com/xiezie/p/5930503.html Android JNI之JAVA与C++对象建立对称关联 1.JAVA对象持有C++对象 ...
- C语言二叉树的建立与遍历
二叉树的建立和遍历都要用到递归,先暂时保存一下代码,其中主要是理解递归的思想,其它的就都好理解了.这里是三种遍历方式,其实理解一种,其它的几个就都理解了,就是打印出来的顺序不一样而已.建立和遍历的方式 ...
- C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历、中序遍历、后续遍历)
树 利用顺序存储和链式存储的特点,可以实现树的存储结构的表示,具体表示法有很多种. 1)双亲表示法:在每个结点中,附设一个指示器指示其双亲结点在数组中的位置. 2)孩子表示法:把每个结点的孩子排列起来 ...
- Java实现二叉树的前序、中序、后序遍历(非递归方法)
在上一篇博客中,实现了Java中二叉树的三种遍历方式的递归实现,接下来,在此实现Java中非递归实现二叉树的前序.中序.后序遍历,在非递归实现中,借助了栈来帮助实现遍历.前序和中序比较类似,也简单 ...
- 二叉树的建立以及遍历的多种实现(python版)
二叉树是很重要的数据结构,在面试还是日常开发中都是很重要的角色. 首先是建立树的过程,对比C或是C++的实现来讲,其涉及到了较为复杂的指针操作,但是在面向对象的语言中,就不需要考虑指针, 内存等.首先 ...
随机推荐
- Effective C++ 第0章 explicit构造函数
按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* p ); ...
- Var的用法解析
C#关键字是伴随着.NET 3.5以后,伴随着匿名函数.LINQ而来, 由编译器帮我们推断具体的类型.总体来说,当一个变量是局部变量(不包括类级别的变量),并且在声明的时候初始化,是使用var关键字的 ...
- 前端开发 JavaScript 规范文档
一,规范目的 为提高团队协作效率,便于前端后期优化维护,输出高质量的文档. 二.基本准则 符合web标准,结构表现行为分离,兼容性优良.页面性能方面,代码要求简洁明了有序, 尽可能的减小服务器负载,保 ...
- React Native Flexbox & CSS3 Flexbox
React Native Flexbox & CSS3 Flexbox https://facebook.github.io/react-native/docs/flexbox/ https: ...
- react-redux的基本用法
注意:读懂本文需要具备redux基础知识, 注明:本文旨在说明如何在实际项目中快速使用react-redux,限于篇幅,本文对具体的原理并未做分析,请参考redux官网 我一直以为我写了一篇关于rea ...
- nginx的限流问题
nginx的限流问题 http{ limit_req_zone $binary_remote_addr zone=req_one:10m rate=100r/s;server{ listen 8080 ...
- subprocess
在没有subprocess这个模块的时候,我们怎么去跟我们的操作系统做交互的呐?下面我们先说说这三个模块:os.system().os.popen().commands. 1. os.system( ...
- .Net Core实践3 配置文件
环境 .netcore2.1 / vs2017 / win10 / centos7 在.netcore项目中读取配置文件,先添加应用程序配置文件App.config.这个是类库项目的配置文件名. Sy ...
- python之路day07-集合set的增删查、列表如何排重(效率最高的方法)、深浅copy
集合set 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. ...
- (转)Java结束线程的三种方法
背景:面试过程中问到结束线程的方法和线程池shutdown shutdownnow区别以及底层的实现,当时答的并不好. Java结束线程的三种方法 线程属于一次性消耗品,在执行完run()方法之后线程 ...