二叉排序树

  • 二叉排序树是一个基础的树的数据结构。应用许多。
  • 它的特性就是,左孩子小于parent。右孩子大于parent.

寻找节点

寻找节点就是直接依据数值的大小。从root节点開始遍历,大于当前遍历节点就向它的右子树查找,相反则查找它的左子树。

然后返回。

查找最大最小节点

直接依据root节点,遍历到最右就是最大节点,遍历到最左,就是最小节点。

插入节点

插入节点我这里插入的节点都会成为叶子节点。依据大小的关系向下遍历,遍历到最后的节点,然后插入就能够了。

删除节点

这里删除节点是相对麻烦一点的。在删除的节点是一个叶子节点的时候。或者仅仅有一个孩子的时候,那么直接把当前节点删除让孩子取代自己的位置就能够了,在被删除的节点左右孩子都存在的时候,要删除当前节点,就须要用自己右子树的最小节点来取代被删除的节点。

代码例如以下

//
//  main.cpp
//  BSTree
//
//  Created by Alps on 14-7-31.
//  Copyright (c) 2014年 chen. All rights reserved.
//#include <iostream>
#define ElementType intusing namespace std;struct Node;
typedef Node* PtrToNode;
typedef PtrToNode TreeNode;TreeNode makeEmpty(TreeNode T);
int isEmpty(TreeNode T);
TreeNode findTree(ElementType X,TreeNode T);
TreeNode findMin(TreeNode T);
TreeNode findMax(TreeNode T);
TreeNode insertTree(ElementType X, TreeNode T);
TreeNode deleteTree(ElementType X, TreeNode T);struct Node{ElementType element;TreeNode left;TreeNode right;
};TreeNode makeEmpty(TreeNode T){if (T != NULL) {makeEmpty(T->left);makeEmpty(T->right);free(T);}return NULL;
}int isEmpty(TreeNode T){return T == NULL;
}TreeNode findTree(ElementType X,TreeNode T){if (T == NULL) {return NULL;}if (X < T->element) {return findTree(X, T->left);}else if(X > T->element){return findTree(X, T->right);}else{return T;}
}TreeNode findMin(TreeNode T){if (T == NULL) {return NULL;}if (T->left == NULL) {return T;}else{return findMin(T->left);}
//    return NULL;
}TreeNode findMax(TreeNode T){if (T == NULL) {return NULL;}if (T->right  == NULL) {return T;}else{return findMax(T->right);}
//    return NULL;
}TreeNode insertTree(ElementType X, TreeNode T){if (T == NULL) {T = (TreeNode)malloc(sizeof(Node));T->element = X;T->left = NULL;T->right = NULL;}else if(X > T->element){T->right = insertTree(X, T->right);}else if(X < T->element){T->left = insertTree(X, T->left);}return T;
}TreeNode deleteTree(ElementType X, TreeNode T){TreeNode XNode = findTree(X, T);if (XNode == NULL || T == NULL) {printf("can't find the node is : %d",X);exit(1);}if (X > T->element) {T->right = deleteTree(X, T->right);}else if(X < T->element){T->left = deleteTree(X, T->left);}else{TreeNode tmp;if (T->left && T->right) {tmp = findMin(T->right);T->element = tmp->element;T->right = deleteTree( T->element, T->right);}else{tmp = T;if (T->left == NULL) {T = T->right;}elseif (T->right == NULL) {T = T->left;}free(tmp);}}return T;
}void PreOrderTree(TreeNode T){if (T != NULL) {printf("%d ",T->element);PreOrderTree(T->left);PreOrderTree(T->right);}
}int main(int argc, const char * argv[])
{TreeNode T = (TreeNode)malloc(sizeof(Node));T = makeEmpty(T);T = insertTree(6, T);T = insertTree(2, T);T =insertTree(8, T);T =insertTree(1, T);T = insertTree(5, T);T =insertTree(3, T);T = insertTree(4, T);
//    printf("%d\n",T->element);PreOrderTree(T);printf("\n");TreeNode tmp;tmp = findTree(2, T);printf("%d\n",tmp->element);T = deleteTree(2, T);PreOrderTree(T);printf("\n");tmp = findMax(T);printf("%d\n",tmp->element);tmp = findMin(T);printf("%d\n",tmp->element);
//    std::cout << "Hello, World!\n";return 0;
}

二叉查找树(二叉排序树)创建,插入,删除操作。相关推荐

  1. 顺序表和单链表的插入删除操作时间复杂度的区别

    顺序表和单链表的插入删除操作时间复杂度的区别 最近在学习数据结构,看到如果需要用到大量的插入和删除操作,单链表的效率会高于顺序表.看到这里时内有有个疑惑,这两种数据结构的插入和删除操作的时间复杂度不都 ...

  2. c语言用链表对学生成绩排序,学生成绩排序和平均分计算利用c语言链表的创建插入删除.doc...

    #define NULL 0 #define LEN sizeof(struct student) struct student { long num; float score; struct stu ...

  3. 浅析B树、B+树插入删除操作(附代码实现)

    首先自平衡树是为了解决二叉搜索树在有序数据中退化为链表的问题(即查找时间退化为 O(n) 级别). 自平衡树中,B树.B+树可以说是最简单的,没有旋转.变色等操作.我们可以拿多路平衡查找树和同样是自平 ...

  4. (图解)循环队列的三种判断队空、队满操作(附带源码和插入删除操作等一些基本操作)

    目录 一.普通的顺序存储队列 二.循环队列 (1)少用一个元素空间 i.初始化队列操作: iii.入队操作: iv.出队操作: (2)设置flag标志 i.初始化队列操作: ii.判断队空操作: ii ...

  5. 二叉查找树 (BST)| 删除操作

    我们已经讨论了二叉查找树(BST)|搜索及插入操作.在这篇文章中,将讨论删除操作. 当我们删除一个节点时,会出现三种可能性: 1)要删除的节点是叶节点:我们只需要将该节点从树中直接删除即可 2)要删除 ...

  6. mysql 插入删除操作_MySQL——增删改操作

    插入语句 一次插入操作只插入一行数据 insert into [tablename](listname1,listname2,......) values (value1,value2,......) ...

  7. 数据结构-----AVL树的插入删除操作

    对于AVL的插入和删除,主要利用的就是上篇文章所述的四种旋转操作,根据插入后不同的结构选用不同的方式复原平衡. 再次声明一下,http://www.cnblogs.com/QG-whz/p/51672 ...

  8. 二叉搜索树(创建,插入,删除):基础篇,适合新手观看。

    1.1 二叉搜索树的插入 二叉搜索树的概念相信大家都很清楚,无非就是左小右大 创建二叉搜索树,其实就是多次调用二叉搜索树的插入方法,所以首先我们来讲讲如何插入节点到二叉搜索树里,假设一颗二叉搜索树如下 ...

  9. 链表(创建,插入,删除和打印输出

    http://www.bianceng.cn/Programming/C/200705/327.htm  (以下不全,去此网址看) 数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了 ...

  10. 详细介绍红黑树 性质 定义 插入删除操作

    红黑树 定义 节点是红色或黑色 根结点一定是黑色 所有叶子节点都是黑色(指的是null) 每个红色节点的两个子节点都是黑色(从每个叶子到根的所有路径上不能有两个连续的红色节点) 从任意节点到其每个叶子 ...

最新文章

  1. pyspark性能调优参数
  2. 光测力学-栅线投影/面结构光技术
  3. (017)java后台开发之客户端通过HTTP获取接口Json数据
  4. eclipse集成lombok了但是无法使用_编码神奇Lombok!搭配IDEA更爽哦!
  5. 字符串,枚举,数值之间的转换
  6. python字符串基本操作-Python 基本字符串操作
  7. 讲讲Print里面还有什么参数可以设置
  8. mysql 快照能否恢复某个表_mysql全库备份恢复某个表
  9. Horizon View 7 发布Win10桌面二:即时克隆桌面池配置
  10. 解决sublime text3 v3.1.1,Build3176中的汉字形状扭曲问题
  11. java 定义全局变量_都说变量有七八种,到底谁是 Java 的亲儿子
  12. Redis遍历所有key的两个命令 -- KEYS 和 SCAN
  13. Golang 新手入门教程(一):Go 安装与配置
  14. PaddlePaddle证件照换底换大小工具
  15. python for循环求1到100的和_python中用for循环语句实现1加到100的方法
  16. JavaScript数组map方法
  17. 《如何阅读一本书》读后总结
  18. 制造业OEER语言数据挖掘之相关性分析
  19. 自学MBA,我推荐你看这本《MBA必读12篇》
  20. css如何选择相同class下的第一个class元素和最后一个元素?

热门文章

  1. 一次性打开计算机任意程序的脚本(C语言)
  2. 前端基于gulp后端基于freemarker的工作流程总结
  3. redis3.2.3安装部署实战
  4. [翻译] NSRegexTester
  5. jQuery 分页插件 jPages 使用
  6. 使用 IntraWeb (15) - 基本控件之 TIWEdit、TIWMemo、TIWText
  7. 备份集中的数据库备份与现有的 '***' 数据库不同 RESTORE DATABASEnbs
  8. 810D - 如何写学术论文
  9. sql 随机数高效率算法
  10. Android中pendingIntent的深入理解