算法-二叉查找树

二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:

1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

2. 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

3. 任意节点的左、右子树也分别为二叉查找树;

4. 没有键值相等的节点;

本文跟前文一样只是实现了增加和查找功能,需要一个节点辅助类:

@interface BinaryNode:NSObject

@property  (strong,nonatomic)  NSString  *key;//键

@property  (strong,nonatomic)  NSString  *value;//值

@property (strong,nonatomic) BinaryNode  *left;//左子树的节点

@property (strong,nonatomic) BinaryNode  *right;//右子树的节点

@property  (assign,nonatomic)  NSInteger childCount;//以该结点为根的自述中的结点总数

-(void)initWithData:(NSString *)key  value:(NSString *)value  childCount:(NSInteger)childCount;

@end

BinaryNode实现代码:

@implementation BinaryNode

-(void)initWithData:(NSString *)key value:(NSString *)value childCount:(NSInteger)childCount{
    self.key=key;
    self.value=value;
    self.childCount=childCount;
}

@end

二叉查找树需要顶一个一个根结点:

@interface BinarySearchTree : NSObject

@property  (strong,nonatomic)  BinaryNode  *root;//二叉平衡树的根节点

-(NSString  *)get:(NSString *)key;//获取键对应的值

-(void)put:(NSString *)key  value:(NSString *)value;//插入键值对

@end

实现代码:

@implementation BinarySearchTree

-(NSString *)get:(NSString *)key{
    return [self getByKey:self.root key:key];
}

-(NSString *)getByKey:(BinaryNode *)node  key:(NSString *)key{
    //在node为根结点的子树种查找并返回key所对应的值
    //如果找不到返回null
    if (node==nil) {
        return nil;
    }
    //左右节点进行比较,每个结点的键值大于左子树的结点值小于右子树的结点值
    NSInteger  compare=[key integerValue]-[node.key integerValue];
    if (compare>0) {
        return [self getByKey:node.right key:key];
    }else if(compare<0){
        return [self getByKey:node.left key:key];
    }else{
        return node.value;
    }
}
//http://www.cnblogs.com/xiaofeixiang
-(void)put:(NSString *)key value:(NSString *)value{
    //查找键值,找到则更新它的值,否则为它创建一个新的结点
    self.root=[self putNode:self.root key:key value:value];
}

-(BinaryNode *)putNode:(BinaryNode *)node  key:(NSString *)key  value:(NSString *)value{
    if (node==nil) {
        BinaryNode  *newNode=[[BinaryNode alloc]init];
        [newNode initWithData:key value:value childCount:1];
        return newNode;
    }
    NSInteger  compare=[key integerValue]-[node.key integerValue];
    if (compare>0) {
        node.right=[self putNode:node.right key:key value:value];
    }else if(compare<0){
        node.left=[self putNode:node.left key:key value:value];
    }else{
        node.value=value;
    }
    node.childCount=[self childSizeCount:node.left]+[self childSizeCount:node.right]+1;
    return node;
}

-(NSInteger)childSize{
    return [self childSizeCount:self.root];
}

-(NSInteger)childSizeCount:(BinaryNode *)node{
    if (node==nil) {
        return 0;
    }else{
        return node.childCount;
    }
}
@end

测试:

        BinarySearchTree  *binaryTree=[[BinarySearchTree alloc]init];
        [binaryTree put:@"3" value:@"FlyElephant"];
        [binaryTree put:@"9" value:@"http://www.cnblogs.com/xiaofeixiang"];
        [binaryTree put:@"10" value:@"博客园"];
        [binaryTree put:@"0" value:@"228407086"];
        NSString  *temp=[binaryTree get:@"9"];
        NSLog(@"二叉查找树:%@",temp);

效果如下:

时间: 2024-10-15 19:10:45

算法-二叉查找树的相关文章

算法—二叉查找树的相关一些操作及总结

二叉查找树得以广泛应用的一个重要原因就是它能够保持键的有序性,因此它可以作为实现有序符号表API中的众多方法的基础.这使得符号表的用例不仅能够通过键还能通过键的相对顺序来访问键值对.下面,我们要研究有序符号表API中各个方法的实现. 1.最大键和最小键 如果根结点的左链接为空,那么一棵二叉查找树中最小的键就是根结点:如果左链接非空,那么树中的最小键就是左子树中的最小键.简单的循环也能等价实现这段描述,但为了保持一致性我们使用了递归.找出最大键的方法也是类似的,只是变为查找右子树而已. 2.向上取

数据结构和算法-二叉查找树

二叉查找树(Binary Search Tree), 简称BST,必须具有以下性质: 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根结点的值 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根结点的值 任意节点的左.右子树也分别为二叉查找树 没有键值相等的节点 在二叉查找树中查找节点时, 平均运行时间为O(logn)(平衡情况), 最坏为O(n)(极度不平衡), 平均深度是O(logn) 在有序数组中使用二分查找时最坏的时间复杂度是O(logn), 但是二叉搜索树的插入和删除

[数据结构与算法] : 二叉查找树

头文件 1 typedef int ElementType; 2 #ifndef _TREE_H_ 3 #define _TREE_H_ 4 5 struct TreeNode; 6 typedef struct TreeNode *Position; 7 typedef struct TreeNode *SearchTree; 8 9 SearchTree MakeEmpty(SearchTree T); 10 Position Find(ElementType X, SearchTree T

算法系列笔记3(二叉查找树)

(1)二叉查找树的性质:设x为二叉查找树的一个结点.如果y是x左子树中的一个结点,则key[y]≤key[x].如果y是x的右子树中的一个结点.则key[x]≤key[y]. (2)二叉查找树的结点中除了key域和卫星数据外,还包括left.right和p分别指向结点的左儿子.右儿子和父节点. (3)构造一棵二叉查找树最好情况下时间复杂度为O(nlgn),最坏情况为O(n^2).随机化构造一棵二叉查找树的期望时间O(nlgn).与快排和随机化快速排序算法是做相同的比较,但是顺序不一样.可以证明随

算法导论学习笔记——第12章 二叉查找树

二叉查找树性质 设x是二叉查找树中的一个结点,如果y是x的左子树中的一个结点,则k[y]<=key[x]:如果y是右子树中的一个结点,则k[y]>=k[x] 1 //中序遍历算法,输出二叉查找树T中的全部元素 2 INORDER-TREE-WALK(x) 3 if x!=nil 4 then INORDER-TREE-WALK(left[x]) 5 print key[x] 6 INORDER-TREE-WALK(right[x]) 查找 1 //递归版本 2 TREE-SEARCH(x,k)

018给定二叉查找树的一个结点, 写一个算法查找它的“下一个”结点“(keep it up)

给定二叉查找树的一个结点, 写一个算法查找它的"下一个"结点(即中序遍历后它的后继结点), 其中每个结点都有指向其父亲的链接. 这个题本质就是线索化二叉树时找后继结点的题.找后继结点存在两种情况: 1 如果当前结点有右孩子,则后继结点为右孩子的最左结点 2 如果没有右孩子, A 当前结点为父结点的左孩子,则父结点就是后继结点 B 当前结点为父结点的右孩子,则向父结点找,直到当前结点不是父结点的右孩子终止,此时 父节点就是后继结点 代码: struct TreeNode { int da

算法学习 - 平衡二叉查找树实现(AVL树)

平衡二叉查找树 平衡二叉查找树是很早出现的平衡树,因为所有子树的高度差不超过1,所以操作平均为O(logN). 平衡二叉查找树和BS树很像,插入和删除操作也基本一样,但是每个节点多了一个高度的信息,在每次插入之后都要更新树的每个节点的高度,发现不平衡之后就要进行旋转. 单旋转 单旋转是碰到左左或者右右的情况下所使用的方法. 例如: 3 2 1 这种情况就需要旋转,因为3是根节点,它的左子树高度为0,右子树高度为2,相差超过1了,所以要进行旋转,而这是右右的情况,所以是单旋转. 2 / 1 3 这

算法—8.二叉查找树

1.基本思想 我们将学习一种能够将链表插入的灵活性和有序数组查找的高效性结合起来的符号表实现.具体来说,就是使用每个结点含有两个链接(链表中每个结点只含有一个链接)的二叉查找树来高效地实现符号表,这也是计算机科学中最重要的算法之一. 定义:一棵二叉查找树(BST)是一棵二叉树,其中每个结点都含有一个Comparable的键(以及相关联的值)且每个结点的键都大于其左子树中的任意结点的键而小于右子树的任意结点的键. 2.具体算法 /** * 算法3.3 基于二叉查找树的符号表 * Created b

算法导论 第12章 二叉查找树

二叉查找树是一种树数据结构,它与普通的二叉树最大的不同就是二叉查找树满足一个性质:对于树中的任意一个节点,均有其左子树中的所有节点的关键字值都不大于该节点的关键字值,其右子树中的任意一个节点的关键字值都不小于该节点的关键字值. 在二叉查找树上可以进行搜索.取最小值.取最大值.取指定节点的前驱.取指定节点的后继以及插入和删除节点操作,因此二叉查找树和堆(大顶堆和小顶堆)一样,也可以做优先队列,都能够在 O(lgn) 的时间内取得集合的最大值和最小值.一个二叉查找树的期望高度为O(lgn),因此在二