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

头文件

 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);
11 Position FindMin(SearchTree T);
12 Position FindMin2(SearchTree T);
13 Position FindMax2(SearchTree T);
14 SearchTree Insert(ElementType X, SearchTree T);
15 SearchTree Delete(ElementType X, SearchTree T);
16 ElementType Retrieve(Position P);
17
18 #endif

源文件

  1 #include "tree.h"
  2 #include "fatal.h"
  3 #include <malloc.h>
  4
  5 struct TreeNode
  6 {
  7     ElementType Element;
  8     SearchTree  Left;
  9     SearchTree  Right;
 10 };
 11
 12 // 先清空左子树, 再清空又子树, 再释放自身节点
 13 SearchTree MakeEmpty(SearchTree T)
 14 {
 15     if(T != NULL)
 16     {
 17         MakeEmpty(T->Left);
 18         MakeEmpty(T->Right);
 19         free(T);
 20     }
 21     return NULL; // 递归终止条件
 22 }
 23
 24 // 查找, 类似二分查找
 25 Position Find(ElementType X, SearchTree T)
 26 {
 27     if(T == NULL) // 递归终止条件
 28         return NULL;
 29     if(X < T->Element)
 30         return Find(X, T->Left);
 31     else if(X > T->Element)
 32         return Find(X, T->Right);
 33     else
 34         return T;
 35 }
 36
 37 Position FindMin(SearchTree T) // 递归实现
 38 {
 39     if(T == NULL) // 防止非法输入
 40         return NULL;
 41     if(T->Left == NULL) // 递归终止
 42         return T;
 43     else
 44         return FindMin(T->Left);
 45 }
 46
 47 Position FindMin2(SearchTree T) // 非递归实现
 48 {
 49     if(T == NULL)
 50         return NULL;
 51     while(T->Left != NULL)
 52         T = T->Left;
 53     return T;
 54 }
 55
 56 Position FindMax(SearchTree T)
 57 {
 58     if(T == NULL)
 59         return NULL;
 60     if(T->Right == NULL)
 61         return T;
 62     else
 63         return FindMax(T->Right);
 64 }
 65
 66 Position FindMax2(SearchTree T)
 67 {
 68     if(T == NULL)
 69         return NULL;
 70     while(T->Right != NULL)
 71         T = T->Right;
 72     return T;
 73 }
 74
 75 // 插入
 76 SearchTree Insert(ElementType X, SearchTree T)
 77 {
 78     if(T == NULL) // 如果T为NULL, 创建节点, 递归终止条件
 79     {
 80         T = (SearchTree)malloc(sizeof(struct TreeNode));
 81         if(T == NULL)
 82             FatalError("Out of space!");
 83         else
 84         {
 85             T->Element = X;
 86             T->Left = T->Right = NULL;
 87         }
 88     }
 89     else if(X < T->Element)
 90         T->Left = Insert(X, T->Left);
 91     else if(X > T->Element)
 92         T->Right = Insert(X, T->Right);
 93     // 如果X已经在数中, 则什么也不做
 94     return T; // Do not forget this line!!
 95 }
 96
 97 // 删除
 98 SearchTree Delete(ElementType X, SearchTree T)
 99 {
100     Position TempCell;
101     if(T == NULL) // 递归终止
102         Error("Element not found!");
103     else if(X < T->Element)
104         T->Left = Delete(X, T->Left);
105     else if(X > T->Element)
106         T->Right = Delete(X, T->Right);
107     else if(T->Left && T->Right)  // Two children
108     {
109         TempCell = FindMin(T->Right);// 找一个替身, 右子树的最小值
110         T->Element = TempCell->Element;
111         T->Right = Delete(T->Element, T->Right);// 替身已经放到T->Element, 再从右子树删除该值即可
112     }
113     else                          // One or zero childern
114     {
115         TempCell = T;
116         if(T->Left == NULL)
117             T = T->Right;
118         else if(T->Right = NULL)
119             T = T->Left;
120         free(TempCell);
121     }
122     return T; // Do not forget this line!!
123 }
124
125 ElementType Retrieve(Position P)
126 {
127     return P->Element;
128 }

测试文件

 1 #include "tree.h"
 2 #include <stdio.h>
 3
 4 int main()
 5 {
 6     SearchTree T;
 7     Position P;
 8     int i = 0, j = 0;
 9
10     T = MakeEmpty(NULL);
11     for( i = 0; i < 50; i++, j = ( j + 7 ) % 50 )
12         T = Insert( j, T );
13     for( i = 0; i < 50; i++ )
14         if( ( P = Find( i, T ) ) == NULL || Retrieve( P ) != i )
15             printf( "Error at %d\n", i );
16
17     for( i = 0; i < 50; i += 2 )
18         T = Delete( i, T );
19
20     for( i = 1; i < 50; i += 2 )
21         if( ( P = Find( i, T ) ) == NULL || Retrieve( P ) != i )
22             printf( "Error at %d\n", i );
23     for( i = 0; i < 50; i += 2 )
24         if( ( P = Find( i, T ) ) != NULL )
25             printf( "Error at %d\n", i );
26
27     printf( "Min is %d, Max is %d\n", Retrieve( FindMin2( T ) ),
28                Retrieve( FindMax2( T ) ) );
29
30     return 0;
31 }
时间: 2024-08-08 20:15:20

[数据结构与算法] : 二叉查找树的相关文章

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

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

数据结构与算法系列----平衡二叉树(AVL树)

一:背景 平衡二叉树(又称AVL树)是二叉查找树的一个进化体,由于二叉查找树不是严格的O(logN),所以引入一个具有平衡概念的二叉树,它的查找速度是O(logN).所以在学习平衡二叉树之前,读者需要了解二叉查找树的实现,具体链接:二叉查找树 那么平衡是什么意思?我们要求对于一棵二叉查找树 ,它的每一个节点的左右子树高度之差不超过1.(对于树的高度的约定:空节点高度是0:叶子节点高度是1.)例如下图: 如果我们的二叉查找树是不平衡该怎么办?进行旋转.经过分析发现,出现不平衡无外乎四种情况,下面我

数据结构与算法系列 目录

最近抽空整理了"数据结构和算法"的相关文章.在整理过程中,对于每种数据结构和算法分别给出"C"."C++"和"Java"这三种语言的实现:实现语言虽不同,但原理如出一辙.因此,读者在了解和学习的过程中,择其一即可! 下面是整理数据数据和算法的目录表,对于每一种按照C/C++/Java进行了划分,方便查阅.若文章有错误或纰漏,请不吝指正.谢谢! 数据结构和算法目录表   C C++ Java 线性结构 1. 数组.单链表和双链表

常见数据结构与算法整理总结(上)

数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作.算法是为求解一个问题需要遵循的.被清楚指定的简单指令的集合.下面是自己整理的常用数据结构与算法相关内容,如有错误,欢迎指出. 为了便于描述,文中涉及到的代码部分都是用Java语言编写的,其实Java本身对常见的几种数据结构,线性表.栈.队列等都提供了较好的实现,就是我们经常用到的Java集合框架,有需要的可以阅读这篇文章.Java - 集合框架完全解析 一.线性表 1.数组实现 2.链表 二.栈与队列 三.树

数据结构与算法知识大纲

数据结构与算法 1.线性结构 (1)线性表 ①线性表的定义 ②线性表的存储结构 ③线性表的应用 (2)栈和队列 ①栈 ②队列 (3)串 ①串的定义及基本运算 ②串的存储结构 2.数组和矩阵 (1)数组 (2)矩阵 3.树和图 (1)树 ①树的定义 ②二叉树的定义和基本运算 ③二叉树的性质 ④二叉树的存储结构 ⑤二叉树的遍历 ⑥最优二叉树 ⑦二叉查找树 (2)图 ①图的定义及术语 ②图的存储结构 4.常用算法 (1)算法概述 ①算法的基本概念 ②算法与数据结构 ③算法的描述 ④算法效率 (2)排序

MySQL索引背后的数据结构及算法原理

摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎 对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree索 引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论. 数据结构及算法基础 索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干

第一章:数据结构与算法javascript描述

在前端工程师中,常常有一种声音,我们为什么要学数据结构与算法,没有数据结构与算法,我们一样很好的完成工作.实际上,算法是一个宽泛的概念,我们写的任何程序都可以称为算法,甚至往冰箱里放大象,也要通过开门,放入,关门这样的规划,我们也可以视作为一种算法.可以说:简单的算法是人类的本能.而算法的知识的学习则是吸取前人的经验.对于复杂的问题进行归类,抽象,帮助我们脱离刀耕火种的时代,系统掌握一个算法的过程. 随着自身知识的增长,不论是做前端,服务端还是客户端,任何一个程序员都会开始面对更加复杂的问题,算

浅谈MySQL索引背后的数据结构及算法

摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持 也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree索引,因为这是 平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论. 文章主要内容分为四个部分. 第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础. 第二部分结合MySQL数据库中

java数据结构与算法之平衡二叉树(AVL树)的设计与实现

[版权申明]未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53892797 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设