BinarySearchTree

二叉树



一棵二叉树是每个结点都含有一个comparable的键,且每个结点的键都大于其左子树中的任意结点而小于其右子树的左右结点的数据结构。

基本实现(二叉树结点)



可以用一个私有的类来表示二叉树上的结点。每个结点可以含有一个键,值,左链接,右链接和一个计数器。左链接指向小于该结点的所有键组成的二叉树,而右链接指向大于该结点的所有键组成的二叉树。总之一颗二叉树代表了键值的集合。

 1 private class Node {
 2     private Key key;
 3     private Value value;
 4     private Node left, right;
 5     private int N;
 6
 7     public Node(Key key, Value value, int N) {
 8         this.key = key;
 9         this.value = value;
10         this.N = N;
11     }

基本实现(插入和查找)



当插入一个不存在于树种的结点并结束于一条空链接时,我们需要做的就是将链接指向一个含有被查找键的新结点。如果被查找的键小于根结点的键,我们就会继续在左字数中插入改键,否则在右子树中插入该键。使用递归实现这一例程。

 1     /***********************************************************************
 2      * Insert key-value pair into BST If key already exists, update with new
 3      * value
 4      ***********************************************************************/
 5    public void put(Key key,Value value){
 6        if(value == null) return;
 7        root = put(root, key, value);
 8    }
 9
10    public Node put(Node x,Key key,Value value){
11        if(x == null) return new Node(key, value, 1);
12        int cmp = key.compareTo(x.key);
13        if(cmp < 0) x.left = put(x.left, key, value);
14        else if(cmp > 0) x.right = put(x.right, key, value);
15        else x.value = value;
16        return x;
17    }

在二叉树中随着不断向下查找,当前结点所表示的子树的大小也在减少,当找到一个含有被查找的键的结点或者是当前子树变成空的时候查找才会停止,从根结点开始,在每个结点查找进程都会递归地在它的一个子结点展开,因此一次查找也就定义了树的一条路径。对于命中的查找,路径在含有被查找的键的结点处结束,对于未命中的查找,路径的终点是一个空的链接。

 1     /***********************************************************************
 2      * Search BST for given key, and return associated value if found, return
 3      * null if not found
 4      ***********************************************************************/
 5     public boolean contains(Key key) {
 6         return get(key) != null;
 7     }
 8     // return value associated with the given key, or null if no such key exists
 9     public Value get(Key key) {
10         return get(root, key);
11     }
12
13     private Value get(Node x, Key key) {
14         if(x == null) return null;
15         int cmp = key.compareTo(x.key);
16         if(cmp < 0) return get(x.left,key);
17         else if(cmp > 0) return get(x.right,key);
18         else return x.value;
19     }

例程的复杂度分析



使用二叉查找树算法的运行时间取决于树的形状,而树的形状有取决于插入的先后顺序。最好的情况下树是完全平衡的,此时的复杂度是lonN,而最坏的情况是搜索所经可能有N个结点,此时是查找的复杂度是线的。

  • 在由N个随机键构造的二叉树中,查找命中命中所需要的平均次数是2lnN

时间: 2024-10-26 03:14:39

BinarySearchTree的相关文章

数据结构(Java语言)——BinarySearchTree简单实现

二叉树的一个重要应用是它们在查找中的使用.使二叉树成为二叉查找树的性质是,对于树中的每个节点X,它的左子树中所有项的值都大于X中的项.注意,这意味着该树所有的元素都可以用某种一致的方式排序. 现在给出通常对二叉查找树进行的操作的简单描述.注意,由于树的递归定义,通常是递归地编写这些操作的例程.因为二叉查找树的平均深度是O(logN),所以一般不必担心栈空间耗尽. 二叉查找树要求所有的项都能够排序.要写出一个一般的类,我们需要提供一个接口来表示这个性质.这个接口就是Comparable,它告诉我们

BinarySearchTree查找二叉树独立实现

先看看实现了哪些功能吧? (1)构造二叉树 (2)遍历二叉树结点 (3)搜索二叉树结点 (4)删除二叉树结点 (5)判断结点是否存在二叉树 看看源码: package hk.inso.service; /** * Created by IntelliJ IDEA. * Date: 8/17/15 11:45 PM * Author: Richard */ public class BinarySearchTree { /** * 根结点,是所有遍历的入口 */ private Node root

基本数据结构之BinarySearchTree

问题描述: BinarySearchTree 问题分析: 基本的实现 代码实现: package c04; /**  * @project: DataStructureAndAlgorithmAnalysis  * @filename: BinarySearchTree.java  * @version: 0.10  * @author: JM Han  * @date: 18:38 2015/10/19  * @comment: Test Purpose  * @result:  */ imp

BinarySearchTree示例——C++模板实现

数据结构和算法理解很简单,深感算法导论的介绍更是精辟而无累赘. 例如:1. 直接切入二叉搜索树,而不是从树开始介绍各种繁琐的表示方式,最后的重点结果还是二叉搜索和几种平衡树,算法导论介绍知识的时候数学性虽强,但应用性也十足,它的 应用性不在于给你代码,而在于给你应用的场景,告诉你各种结构的优劣和代价,这才是学习数据结构和算法应该掌握的精华,而不在一些教材上展示的可以称之为垃圾的代 码上,实际上,关于数据结构的实现代码,工业级的STL源码可以给你最高屋建瓴的精华.   2. 遍历方法仅重点分析中序

JS数据结构之BinarySearchTree

原文链接:http://www.gbtags.com/gb/share/5592.htm 之前zhou--hua 分享了一个sort方法的详解,里面介绍了各种sort的方法,我觉得很有意义~一个好的开发还是需要知道一些重要的算法的.所以我就研究了二叉树BinaryTree BinarySearchTree的好处是处理数据方便,包括插入,删除,排序,查找,都是很优的方法. 我们先来对比一下插入,删除,排序,查找,和其他的算法的复杂度: 1. 插入 ,对于每一个数据的插入来说,他的期望复杂度为O(l

LeetCode108_Convert SortedArray to BinarySearchTree(将有序数组转成二叉排序树) Java题解

题目: Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 题解: 和我上面一篇将有序链表转成二叉排序树中用哈希表解的方法是一样的.基本思路:链表中间那个节点为树的根节点.根节点的左子树节点应该是根节点左边那部分的中间节点,根节点的右节点应该是根节点右边那部分链表的中间节点.后面就依照这个规律依次类推了. public static TreeNode s

用JS实现二叉搜索树

二叉树的节点最多只能有两个子节点,一个左侧子节点,一个右侧子节点. 二叉搜索树(BST),是二叉树的一种,但只允许在左侧节点存储比父节点小的值,在右侧节点存储比父节点大或等于父节点的值. 1.创建BST 1.1创建BST类 首先申明BST类的基本结构 function BinarySearchTree() { var Node = function(key){ this.key = key; this.left = null; this.right = null; }; var root = n

二叉查找树

二叉查找(搜索)树(Binary Search Tree)又称二叉排序树(Binary Sort Tree),是基于二叉树,BST具有下列性质:1.若左子树不空,则其左子树上的所有结点的值均小于根结点的值:2.若右子树不空,则其右子树上的所有结点的值均大于根结点的值:3.左.右子树也分别为二叉查找树. 结点类 public class BinaryNode {      Integer data;      BinaryNode leftChild;      BinaryNode rightC

数据结构与算法(c++)——查找二叉树与中序遍历

查找树ADT--查找二叉树 定义:对于树中的每个节点X,它的左子树中的所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项. 现在给出字段和方法定义(BinarySearchTree.h) #include <queue> class BinarySearchTree { private: struct Node { int value; Node* left; Node* right; }; Node* root; void insert(Node*, int); void trav