数据结构:JAVA_二叉数查找树基本实现(上)
数据结构:JAVA实现二叉查找树
写在前面
二叉查找树(搜索树)是一种能将链表插入的灵活性与有序数组查找的高效性结合在一起的一种数据结构。

观察二叉查找树,我们发现任何一个节点大于左子节点且小于其右子节点,也就是说一个节点的左子树的所有值都小于当前节点,右子树中的所有值都大于当前节点,其中序遍历结果应该是[2,3,4,6,7,8],这是一组排序值,在一组有序值中找到一个特定值最快的方法是二分搜索,也就是说我们在查找树中查找某个特点值的时候也是在做二路选择,即总会在两条路线中做出选择,一定会舍弃其中一条路线。这是完全等同于我们之前学过的二分搜索的。
搜索、插入、删除的复杂度等于树高,期望O(log n),最坏O(n)(数列有序,树退化成线性表,如下图所示)。

代码分解
对节点的结构定义
public class BinaryTree <Key extends Comparable<Key>,Value>{
.......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.val = val;
this.key = key;
}
}
......
}
说明
1.节点具有什么样的功能呢?首先应该拥有自己的键值,其次能指示左右节点,这是二叉树节点中最基本的内容。
2.上面的结构中将节点写为内部类,更好的封装了节点,对外提供更加简洁的接口。
插入(排序)操作
public void put(Key k,Value v)
{
root = put(root,k,v);
} public Node put(Node x,Key k,Value v)
{
if(x==null) return new Node(k,v,1); //默认设置子树包含的节点个数为1 int cmp = k.compareTo(x.key);
if(cmp==0)
x.val=v; if(cmp<0)
x.Left=put(x.Left,k,v);
else
x.Right=put(x.Right,k,v); x.N=size(x.Left)+size(x.Right)+1;
return x;
}
说明:
1.插入的流程应该是什么样子的呢?
2.由于二叉树的特殊结构,每次递归都是有意义的,不需要回溯重走等等操作便可以直接走到目标处。以下分析仅仅是一种特例情况。
3.对递归的简单分析:
首先从root节点开始,如果root节点不存在,就把root节点初始化为该节点。
如果root节点存在,判断键值与root的关系,如果大于往右边走,如果小于往左边走。 (此处往左边走!!)
如果root.Left节点存在,判断键值与root.Left的关系,如果大于往右边走,如果小于往左边走 (此处往左边走!!)
如果root.left.left节点存在,判断键值与root.Left.Left的关系,如果大于往右边走,如果小于往左边走
....
如果root....left不存在,建立节点。
..
如果root....left节点存在,且键值存在相等则修改,并统计N,即子树中节点个数。
查找操作
public Value get(Key k)
{
return get(root,k);
}
public Value get(Node x,Key k)
{
if(x==null) return null;
int cmp = k.compareTo(x.key);
if(cmp==0)
return x.val;
if(cmp<0)
return get(x.Left,k);
else
return get(x.Right,k);
}
说明:
1.获取的流程是怎样的呢?其实就是插入的简化版咯。
2.同样,由于二叉树的特殊性,我认为不存在无用递归,路径是直通目标节点的。
3.关于这里的递归,return方法并不是意味着要返回多个,每一次的return后面的语句都是在递归,所以直到返回目标节点。
关于Size方法和测试方法
public int size(Node X) //返回该节点的子树中的节点个数
{
if(X==null) return 0;
else return X.N;
}
数据结构:JAVA_二叉数查找树基本实现(上)的更多相关文章
- 数据结构:JAVA_二叉数查找树基本实现(中)
数据结构:二叉数查找树基本实现(JAVA语言版) 1.写在前面 二叉查找树得以广泛应用的一个重要原因是它能保持键的有序性,因此我们可以把它作为实现有序符号表API中的众多方法的基础. 也就是说我们构建 ...
- 二叉平衡查找树AvlTree(C实现)
二叉平衡查找树即是一棵树中所有节点的左右子树高度差不超过1的查找树 头文件—————————————————————————————— #ifndef _AVLTREE_H_ #define _AVL ...
- javascript 数据结构与算法---二叉数
二叉树,首先了解一些关于二叉数的概念(来自百度百科) 1. 二叉树(Binary tree)是树形结构的一个重要类型 2. 定义: 二叉树(binary tree)是指树中节点的度不大于2的有序树,它 ...
- 树-二叉搜索树-AVL树
树-二叉搜索树-AVL树 树 树的基本概念 节点的度:节点的儿子数 树的度:Max{节点的度} 节点的高度:节点到各叶节点的最大路径长度 树的高度:根节点的高度 节点的深度(层数):根节点到该节点的路 ...
- 剑指offer-第四章解决面试题思路(二叉收索树和双向链表)
题目:输入一个二叉收索树,将二叉搜索树转换成排序的双向链表.要求不能创建节点,只能将链表中的指针进行改变. 将复杂的问题简单化:思路:二叉收索树,本身是一个排序结构,中序遍历二叉收索树就可以得到一组排 ...
- 数据结构-查找-二叉排序查找(平衡二叉树,B树,B+树概念)
0.为什么需要二叉排序树 1)数组存储方式: 优点:通过下标访问元素,速度快,对于有序数组,可以通过二分查找提高检索效率: 缺点:如果检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低: 2 ...
- C++实用数据结构:二叉索引树
看下面这个问题(动态连续和查询): 有一个数组A(长度为n),要求进行两种操作: add(i,x):让Ai增大x: query(a,b):询问Aa+Aa+1+...+Ab的和: 若进行模拟,则每次qu ...
- 数据结构 之 二叉堆(Heap)
注:本节主要讨论最大堆(最小堆同理). 一.堆的概念 堆,又称二叉堆.同二叉查找树一样,堆也有两个性质,即结构性和堆序性. 1.结构性质: 堆是一棵被完全填满的二叉树,有可能的 ...
- 【算法与数据结构】二叉搜索树的Java实现
为了更加深入了解二叉搜索树,博主自己用Java写了个二叉搜索树,有兴趣的同学可以一起探讨探讨. 首先,二叉搜索树是啥?它有什么用呢? 二叉搜索树, 也称二叉排序树,它的每个节点的数据结构为1个父节点指 ...
随机推荐
- 工作随笔——UIButton的EdgeInsets + Swift中的正则表达式;
1.UIButton的EdgeInsets UIButton的EdgeInsets方法,是用来设置title和image对于上左下右四个方向的偏移,但是很奇怪的是,刚开始只有Image,titile也 ...
- 使用开源库MAGICODES.WECHAT.SDK进行微信公众号支付开发
概要 博客使用Word发博,发布后,排版会出现很多问题,敬请谅解.可加群获取原始文档. 本篇主要讲解微信支付的开发流程,相关业务基于MAGICODES.WECHAT.SDK实现.通过本篇教程,您可以很 ...
- Task Runner Explorer for vs2015找不到啊
https://visualstudiogallery.msdn.microsoft.com/8e1b4368-4afb-467a-bc13-9650572db708/view/ 编译typescri ...
- 给 admin 新建的 hdfs 文件的权限
su hdfs hdfs dfs -chown -R admin / org.apache.hadoop.security.AccessControlException: Permission d ...
- 完美实现类似QQ的自拍头像、上传头像功能!(Demo 源码)
现在很多下载客户端程序都需要设定自己头像的功能,而设定头像一般有两种方式:使用摄像头自拍头像,或者选择一个图片的某部分区域作为自己的头像. 一.相关技术 若要实现上述的自拍头像和上传头像的功能,会碰到 ...
- mongodb( 实现join)
mongodb提供ref和populate的方法,支持类似join的SQL操作.本文给出一个实际的例子: 1. 数据1: var daob = new Schema({ user: { type: S ...
- Homework_4 四则运算 - C#版
题目要求 :http://www.cnblogs.com/gdfhp/p/5311937.html 结对同伴: 姓名:胡仕辉 学号:130201225 博客地址:http://www.cnbl ...
- Host is not allowed to connect to this MySQL server 错误的处理方法
1. mysql>use mysql; mysql>update user set host = '%' where user = 'root'; mysql>select host ...
- Fix catalyst driver in Ubuntu 13.04 / 13.10
Fix catalyst driver in Ubuntu 13.04 / 13.10(墙外文章备份) 1. Introduction I found lots of people strugglin ...
- 在cocos2dx和unity3d之间选择
人生最纠结的事,莫过于有选择………… cocos2dx和unity3d从某种意义上讲,都很不错.但当面对特定需求以及团队情况的时候,总是能分出高下的. 假设,目标游戏是一款类似 刀塔传奇 的游戏 我们 ...

