数据结构: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_二叉数查找树基本实现(上)的更多相关文章

  1. 数据结构:JAVA_二叉数查找树基本实现(中)

    数据结构:二叉数查找树基本实现(JAVA语言版) 1.写在前面 二叉查找树得以广泛应用的一个重要原因是它能保持键的有序性,因此我们可以把它作为实现有序符号表API中的众多方法的基础. 也就是说我们构建 ...

  2. 二叉平衡查找树AvlTree(C实现)

    二叉平衡查找树即是一棵树中所有节点的左右子树高度差不超过1的查找树 头文件—————————————————————————————— #ifndef _AVLTREE_H_ #define _AVL ...

  3. javascript 数据结构与算法---二叉数

    二叉树,首先了解一些关于二叉数的概念(来自百度百科) 1. 二叉树(Binary tree)是树形结构的一个重要类型 2. 定义: 二叉树(binary tree)是指树中节点的度不大于2的有序树,它 ...

  4. 树-二叉搜索树-AVL树

    树-二叉搜索树-AVL树 树 树的基本概念 节点的度:节点的儿子数 树的度:Max{节点的度} 节点的高度:节点到各叶节点的最大路径长度 树的高度:根节点的高度 节点的深度(层数):根节点到该节点的路 ...

  5. 剑指offer-第四章解决面试题思路(二叉收索树和双向链表)

    题目:输入一个二叉收索树,将二叉搜索树转换成排序的双向链表.要求不能创建节点,只能将链表中的指针进行改变. 将复杂的问题简单化:思路:二叉收索树,本身是一个排序结构,中序遍历二叉收索树就可以得到一组排 ...

  6. 数据结构-查找-二叉排序查找(平衡二叉树,B树,B+树概念)

    0.为什么需要二叉排序树 1)数组存储方式: 优点:通过下标访问元素,速度快,对于有序数组,可以通过二分查找提高检索效率: 缺点:如果检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低: 2 ...

  7. C++实用数据结构:二叉索引树

    看下面这个问题(动态连续和查询): 有一个数组A(长度为n),要求进行两种操作: add(i,x):让Ai增大x: query(a,b):询问Aa+Aa+1+...+Ab的和: 若进行模拟,则每次qu ...

  8. 数据结构 之 二叉堆(Heap)

    注:本节主要讨论最大堆(最小堆同理). 一.堆的概念     堆,又称二叉堆.同二叉查找树一样,堆也有两个性质,即结构性和堆序性.     1.结构性质:     堆是一棵被完全填满的二叉树,有可能的 ...

  9. 【算法与数据结构】二叉搜索树的Java实现

    为了更加深入了解二叉搜索树,博主自己用Java写了个二叉搜索树,有兴趣的同学可以一起探讨探讨. 首先,二叉搜索树是啥?它有什么用呢? 二叉搜索树, 也称二叉排序树,它的每个节点的数据结构为1个父节点指 ...

随机推荐

  1. [收集]在iPhone桌面的应用程序图标右上角显示数字

    能够在ios桌面的程序icon右上角显示数字(badge number)的方法 在ViewController中的viewDidLoad方法中添加如下代码即可 - (void)viewDidLoad ...

  2. 道路翻新 (Revamping Trails, USACO 2009 Feb)

    题意:给定m<=50000的1-n有联通的图,求最多可以使K<=20条边变为0的情况下的最短路是多少.. 思路:简单的分层图最短路,对于每个点拆成K个点.. 然后求一边最短路.. code ...

  3. ORM查询语言(OQL)简介--高级篇(续):庐山真貌

    相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山 ...

  4. .NET Mvc Razor也可以这样玩!

    忙碌的工作总是占据了生活的大部分的时间!所以我的博客到现在还是寥寥的几篇文章,技术是用来分享和学习的,对技术有不同的见解,大家都可以分享下,如果如下文章有问题之处请各位指出来,在这个闲下来的时间给大家 ...

  5. PostgreSQL基础整理(二)

    存储过程 实现功能:针对工资表30岁以下,工资提升10% 30至40提升20% 40以上提升30% + 奖金(入参)返回平均薪酬 创建表: DROP TABLE emps; CREATE TABLE ...

  6. Programming Entity Framework CodeFirst -- 约定和属性配置

     以下是EF中Data Annotation和 Fluenlt API的不同属性约定的对照.   Length Data Annotation MinLength(nn) MaxLength(nn) ...

  7. [.net 面向对象编程基础] (23) 结束语

    [.net 面向对象编程基础] (23)  结束语 这个系列的文章终于写完了,用了半个多月的时间,没有令我的粉丝们失望.我的感觉就是一个字累,两个字好累,三个字非常累.小伙伴们看我每篇博客的时间就知道 ...

  8. [ZigBee] 6、ZigBee基础实验——定时器3和定时器4(8 位定时器)

    上一节讲了16位定时器1,本节讲8位定时器3和定时器4! 1.综述 Timer 3 and Timer 4 are two 8-bit timers(8位定时器). Each timer has tw ...

  9. ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇

    在之前的文章中,我为大家介绍了OWIN和Katana,有了对它们的基本了解后,才能更好的去学习ASP.NET Identity,因为它已经对OWIN 有了良好的集成. 在这篇文章中,我主要关注ASP. ...

  10. C#将dll打包到程序中

    最近比较懒,加上内容也不多就懒得排版了,字放大了,看起来应该方便一点 直接进入主题 先来看一个栗子,假设现在有一个第三方dll namespace TestLibrary1 { public clas ...