排序二叉树的插入、删除操作(递归方式)。
/*------------------------------------------------------------------*/
typedef struct node
{
int data;
struct node* lchild;
struct node* rchild;
}Tree,*PTree;
//data of tree struct
/*------------------------------------------------------------------*/
PTree create_node(int value)
{
PTree new_node=NULL;
new_node = (PTree)malloc(sizeof(Tree));
new_node->lchild = new_node->rchild = NULL;
new_node->data = value;
return (new_node);
}//create a new tree node
/*------------tree insert use recursion-----------------------------*/
void insert_tree(PTree _root, int value)
{
if(NULL==_root || value==_root->data)
{
return;
}//when insert value equal root->data,or root is null.just return
else if(value < _root->data)
{
if(_root->lchild==NULL)//find the node,and insert it
{
_root->lchild = create_node(value);
return;
}
else//left tree not null,so recursion again
{
insert_tree(_root->lchild,value);
}
}//find in left child tree
else
{
if(_root->rchild == NULL)//find the node,and insert it
{
_root->rchild = create_node(value);
}
else//right tree not null,so recursion again
{
insert_tree(_root->rchild,value);
}
}//find in right child tree
}
/*------------delete a singel node-----------------------------*/
PTree delete_node(PTree _root)
{
PTree p=pre=NULL;
if(NULL == _root->lchild)
{
p = _root;
_root = _root->rchild;
free(p);
}
else if(NULL == _root->rchild)
{
p = _root;
_root = _root->lchild;
free(p);
}
else
{
pre = _root;
p = _root->lchild;
while(p->rchild) //step to next left child tree
{
pre = p;
p = p->rchild;
}
_root->data = p->data;//value exchange
if(pre == _root)
{
pre->lchild = p->lchild;
}//the root->lchild's right is null
else
{
pre->rchild = p->lchild;
}
free(p);
}
return (_root);
}
/*------------delete node use recursion-----------------------------*/
PTree delete_tree(PTree _root, int _value)
{
if(_root)
{
if(_value == _root->data)
{
_root = delete_node(_root);
}
else if(_value < _root->data)
{
_root = delete_tree(_root->lchild, _value);
}
else
{
_root = delete_tree(_root->rchild, _value);
}
}
return (_root);
}
转载于:https://www.cnblogs.com/gooner/archive/2012/09/10/2678253.html
排序二叉树的插入、删除操作(递归方式)。相关推荐
- 顺序表和单链表的插入删除操作时间复杂度的区别
顺序表和单链表的插入删除操作时间复杂度的区别 最近在学习数据结构,看到如果需要用到大量的插入和删除操作,单链表的效率会高于顺序表.看到这里时内有有个疑惑,这两种数据结构的插入和删除操作的时间复杂度不都 ...
- 数据结构-----AVL树的插入删除操作
对于AVL的插入和删除,主要利用的就是上篇文章所述的四种旋转操作,根据插入后不同的结构选用不同的方式复原平衡. 再次声明一下,http://www.cnblogs.com/QG-whz/p/51672 ...
- 浅析B树、B+树插入删除操作(附代码实现)
首先自平衡树是为了解决二叉搜索树在有序数据中退化为链表的问题(即查找时间退化为 O(n) 级别). 自平衡树中,B树.B+树可以说是最简单的,没有旋转.变色等操作.我们可以拿多路平衡查找树和同样是自平 ...
- mysql 插入删除操作_MySQL——增删改操作
插入语句 一次插入操作只插入一行数据 insert into [tablename](listname1,listname2,......) values (value1,value2,......) ...
- (图解)循环队列的三种判断队空、队满操作(附带源码和插入删除操作等一些基本操作)
目录 一.普通的顺序存储队列 二.循环队列 (1)少用一个元素空间 i.初始化队列操作: iii.入队操作: iv.出队操作: (2)设置flag标志 i.初始化队列操作: ii.判断队空操作: ii ...
- 排序二叉树节点的删除
首先先看看这个删除节点12后的树,还要保证该平衡二叉树的特性保持不变 删除节点详细分为三类: 第一类.所删除的节点是叶子节点,这样就可以先遍历这个树,然后找到需要删除的节点,把它free掉就好 第二类 ...
- BST 递归实现二叉树: 插入 删除 查找
二叉树遍历: 前序遍历: 本身 左子树 右子树 中序遍历: 左子树 本身 右子树 从小到大排列 后续遍历: 左子树 右子树 本身 二叉树前驱: 当前节点左子树最大的节点 二叉树后继: 当前节点右子树最 ...
- 详细介绍红黑树 性质 定义 插入删除操作
红黑树 定义 节点是红色或黑色 根结点一定是黑色 所有叶子节点都是黑色(指的是null) 每个红色节点的两个子节点都是黑色(从每个叶子到根的所有路径上不能有两个连续的红色节点) 从任意节点到其每个叶子 ...
- 二叉树的遍历(非递归方式)
前序非递归遍历(借用栈结构): ①将根节点入栈: ②判栈空,获取栈顶元素输出: ③判断右子树是否为空,再判断左子树是否为空,在回至②执行. void PreOrder(BinTree bt) {sta ...
最新文章
- Keil5简介、下载及安装(NB-IoT专栏—基础篇2)
- bilareralFilter双边滤波函数
- JdbcTemplate类中的execute方法
- java 冒泡 二分法,日常总结---冒泡排序,二分法算法 面试题
- 漫游Kafka实战篇之搭建Kafka运行环境
- 系统测试集成测试单元测试_单元和集成测试的代码覆盖率
- Exchange2003-2010迁移系列之二,迁移前的准备工作(上)
- 【SpringCloud】Spring Cloud bus
- python自带网页解析器_python 之网页解析器
- Python Tricks(二)—— 牛顿法求解平方根(最大整数)
- 自己动手写crud+分页 出现问题
- memset()函数及其作用
- matlab 保存变量
- 恋爱APP软件开发基本功能
- SQL经典面试50题 | 附答案
- linux常识 菜鸟教程
- Python高级编程第2版_张亮 阿信(译)_人民邮电出版社_2017-10_v2_完整版
- 经典大学课程:石油大学教学视频
- 抓包工具charles手机代理抓手机包教程
- LeetCode 27 移除元素 题解