二叉查找树--插入、删除、查找
二叉查找树是满足以下条件的二叉树:1.左子树上的所有节点值均小于根节点值,2右子树上的所有节点值均不小于根节点值,3,左右子树也满足上述两个条件。
二叉查找树的插入过程如下:1.若当前的二叉查找树为空,则插入的元素为根节点,2.若插入的元素值小于根节点值,则将元素插入到左子树中,3.若插入的元素值不小于根节点值,则将元素插入到右子树中。
二叉查找树的删除,分三种情况进行处理:
1.p为叶子节点,直接删除该节点,再修改其父节点的指针(注意分是根节点和不是根节点),如图a。
2.p为单支节点(即只有左子树或右子树)。让p的子树与p的父亲节点相连,删除p即可;(注意分是根节点和不是根节点);如图b。
3.p的左子树和右子树均不空。找到p的后继y,因为y一定没有左子树,所以可以删除y,并让y的父亲节点成为y的右子树的父亲节点,并用y的值代替p的值;或者方法二是找到p的前驱x,x一定没有右子树,所以可以删除x,并让x的父亲节点成为y的左子树的父亲节点。如图c。
查找节点的代码:
pnode search_BST(pnode p, int x)
{bool solve = false;while(p && !solve){if(x == p->val){solve = true; } else if(x < p->val){p = p->lchild; }else{p = p->rchild; }}if(p == NULL){cout << "没有找到" << x << endl; } return p;
}
插入节点的代码:
struct node
{int val;pnode lchild;pnode rchild;
};pnode BT = NULL;//递归方法插入节点
pnode insert(pnode root, int x)
{pnode p = (pnode)malloc(LEN);p->val = x;p->lchild = NULL;p->rchild = NULL;if(root == NULL){root = p; } else if(x < root->val){root->lchild = insert(root->lchild, x); }else{root->rchild = insert(root->rchild, x); }return root;
}//非递归方法插入节点
void insert_BST(pnode q, int x)
{pnode p = (pnode)malloc(LEN);p->val = x;p->lchild = NULL;p->rchild = NULL;if(q == NULL){BT = p;return ; } while(q->lchild != p && q->rchild != p){if(x < q->val){if(q->lchild){q = q->lchild; } else{q->lchild = p;} } else{if(q->rchild){q = q->rchild; } else{q->rchild = p; }}}return;
}
删除节点的代码:
bool delete_BST(pnode p, int x) //返回一个标志,表示是否找到被删元素
{bool find = false;pnode q;p = BT;while(p && !find){ //寻找被删元素 if(x == p->val){ //找到被删元素 find = true; } else if(x < p->val){ //沿左子树找 q = p;p = p->lchild; }else{ //沿右子树找 q = p;p = p->rchild; }}if(p == NULL){ //没找到 cout << "没有找到" << x << endl; }if(p->lchild == NULL && p->rchild == NULL){ //p为叶子节点 if(p == BT){ //p为根节点 BT = NULL; }else if(q->lchild == p){ q->lchild = NULL;} else{q->rchild = NULL; }free(p); //释放节点p }else if(p->lchild == NULL || p->rchild == NULL){ //p为单支子树 if(p == BT){ //p为根节点 if(p->lchild == NULL){BT = p->rchild; } else{BT = p->lchild; }} else{if(q->lchild == p && p->lchild){ //p是q的左子树且p有左子树 q->lchild = p->lchild; //将p的左子树链接到q的左指针上 } else if(q->lchild == p && p->rchild){q->lchild = p->rchild; }else if(q->rchild == p && p->lchild){q->rchild = p->lchild; }else{q->rchild = p->rchild;}}free(p);}else{ //p的左右子树均不为空 pnode t = p;pnode s = p->lchild; //从p的左子节点开始 while(s->rchild){ //找到p的前驱,即p左子树中值最大的节点 t = s; s = s->rchild; }p->val = s->val; //把节点s的值赋给p if(t == p){p->lchild = s->lchild; } else{t->rchild = s->lchild; }free(s); }return find;
}
转载:http://www.cnblogs.com/aiyelinglong/archive/2012/03/27/2419972.html
二叉查找树--插入、删除、查找相关推荐
- 顺序表的插入删除查找遍历
顺序表的插入删除查找遍历 文章目录 顺序表的插入删除查找遍历 代码 运行结果截图 代码 #define Maxsize 100typedef int ElemType; typedef struct{ ...
- 二叉查找树--插入、查找、遍历、打印、删除(重点)
查找二叉树: 一.定义 维基百科: https://zh.wikipedia.org/wiki/%E4%BA%8C%E5%85%83%E6%90%9C%E5%B0%8B%E6%A8%B9 二.代码: ...
- 二叉搜索树-php实现 插入删除查找等操作
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的 ...
- C语言 红黑树插入/删除/查找/遍历
1 红黑树介绍 红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树. 红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子 ...
- 顺序表插入删除查找操作
线性表实验 一.实验目的 1.掌握线性表的顺序存储结构 2.验证顺序表及其基本操作的实现 3.理解算法与程序的关系们能够将顺序表算法转换为对应的程序 二.实验步骤 1.建立含有若干个元素的顺序表 2. ...
- 静态顺序表创建,初始化,插入,删除,查找
#include<stdlib.h> #define MaxSize 20 typedef struct {int data[MaxSize];int length; }sqlist; / ...
- BST 递归实现二叉树: 插入 删除 查找
二叉树遍历: 前序遍历: 本身 左子树 右子树 中序遍历: 左子树 本身 右子树 从小到大排列 后续遍历: 左子树 右子树 本身 二叉树前驱: 当前节点左子树最大的节点 二叉树后继: 当前节点右子树最 ...
- 【数据结构与算法】之双向链表的创建/遍历/插入/删除/查找的算法实现
双向链表简介 双向链表是数据结构中重要的结构,也是线性结构中常用的数据结构,双向指针,方便用户从首结点开始沿指针链向后依次遍历每一个结点,结点的前驱和后继查找方便. 其实双向链表和单向链表也是有很多相 ...
- Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树、二叉查找树的插入节点、二叉查找树的删除、二叉树的遍历、平衡二叉树)C 语言实现
Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树.二叉查找树的插入节点.二叉查找树的删除.二叉树的遍历.平衡二叉树)C++语言实现 目录 树的基础知识 1.二叉树的遍-前序 ...
最新文章
- python自动化ppt_python自动化怎么操作ppt?
- React-Todos
- 计算机组成原理 — CPU — 主存访问
- Lintcode189 First Missing Positive solution 题解
- android 升级带服务端,安卓应用升级服务端设计思路
- python观察日志(part18)--遍历文件夹下文件并判断后缀
- SQL的经典语句(太全了)
- Java5、Java6、Java7的新特性
- Oracle 19.8新特性asmcmd credverify and asmcmd credfix
- Linux单机安装kafka
- 大数据培训:小白如何学好大数据
- 《游戏设计艺术(第2版)》——学习笔记(27)第27章 通过试玩创造好游戏
- RFID技术在图书馆中的应用
- To prevent a memory leak, the JDBC Driver has been forcibly unregistered.异常处理
- 零基础:21天搞定Python分布爬虫
- 【Tensorflow教程笔记】TensorFlow Serving
- 创始人李卉:麦客CRM2.0核心逻辑及其背后的思考
- 荣耀最强拍照手机诞生:荣耀20系列塑造的“潮流科技宇宙”
- 因果推理(causal inference)初步调研
- 习题9-3 平面向量加法 (15 分)