二叉查找树是满足以下条件的二叉树: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

二叉查找树--插入、删除、查找相关推荐

  1. 顺序表的插入删除查找遍历

    顺序表的插入删除查找遍历 文章目录 顺序表的插入删除查找遍历 代码 运行结果截图 代码 #define Maxsize 100typedef int ElemType; typedef struct{ ...

  2. 二叉查找树--插入、查找、遍历、打印、删除(重点)

    查找二叉树: 一.定义 维基百科: https://zh.wikipedia.org/wiki/%E4%BA%8C%E5%85%83%E6%90%9C%E5%B0%8B%E6%A8%B9 二.代码: ...

  3. 二叉搜索树-php实现 插入删除查找等操作

    二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的 ...

  4. C语言 红黑树插入/删除/查找/遍历

    1 红黑树介绍 红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树. 红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子 ...

  5. 顺序表插入删除查找操作

    线性表实验 一.实验目的 1.掌握线性表的顺序存储结构 2.验证顺序表及其基本操作的实现 3.理解算法与程序的关系们能够将顺序表算法转换为对应的程序 二.实验步骤 1.建立含有若干个元素的顺序表 2. ...

  6. 静态顺序表创建,初始化,插入,删除,查找

    #include<stdlib.h> #define MaxSize 20 typedef struct {int data[MaxSize];int length; }sqlist; / ...

  7. BST 递归实现二叉树: 插入 删除 查找

    二叉树遍历: 前序遍历: 本身 左子树 右子树 中序遍历: 左子树 本身 右子树 从小到大排列 后续遍历: 左子树 右子树 本身 二叉树前驱: 当前节点左子树最大的节点 二叉树后继: 当前节点右子树最 ...

  8. 【数据结构与算法】之双向链表的创建/遍历/插入/删除/查找的算法实现

    双向链表简介 双向链表是数据结构中重要的结构,也是线性结构中常用的数据结构,双向指针,方便用户从首结点开始沿指针链向后依次遍历每一个结点,结点的前驱和后继查找方便. 其实双向链表和单向链表也是有很多相 ...

  9. Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树、二叉查找树的插入节点、二叉查找树的删除、二叉树的遍历、平衡二叉树)C 语言实现

    Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树.二叉查找树的插入节点.二叉查找树的删除.二叉树的遍历.平衡二叉树)C++语言实现 目录 树的基础知识 1.二叉树的遍-前序 ...

最新文章

  1. python自动化ppt_python自动化怎么操作ppt?
  2. React-Todos
  3. 计算机组成原理 — CPU — 主存访问
  4. Lintcode189 First Missing Positive solution 题解
  5. android 升级带服务端,安卓应用升级服务端设计思路
  6. python观察日志(part18)--遍历文件夹下文件并判断后缀
  7. SQL的经典语句(太全了)
  8. Java5、Java6、Java7的新特性
  9. Oracle 19.8新特性asmcmd credverify and asmcmd credfix
  10. Linux单机安装kafka
  11. 大数据培训:小白如何学好大数据
  12. 《游戏设计艺术(第2版)》——学习笔记(27)第27章 通过试玩创造好游戏
  13. RFID技术在图书馆中的应用
  14. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.异常处理
  15. 零基础:21天搞定Python分布爬虫
  16. 【Tensorflow教程笔记】TensorFlow Serving
  17. 创始人李卉:麦客CRM2.0核心逻辑及其背后的思考
  18. 荣耀最强拍照手机诞生:荣耀20系列塑造的“潮流科技宇宙”
  19. 因果推理(causal inference)初步调研
  20. 习题9-3 平面向量加法 (15 分)

热门文章

  1. Weka开发[8]-ID3源码介绍
  2. ISE_FIFO_IP核接口测试(一)
  3. 育碧2k微软服务器,育碧服务器出现大规模的BUG:影响到多个平台
  4. 三维点云学习(5)2-Deep learning for Point Cloud-PointNet
  5. fastreport4打印预览
  6. Ubuntu18系统安装使用Nginx
  7. spring boot 支持多少人在线_通过 spring-boot-starter-hbase 集成 HBase
  8. 2019-07-10
  9. 串口IO、定时器、回调函数
  10. 使用GDAL对DEM进行彩色渲染