关于BST的插入,查找和删除
来源:互联网 发布:淘宝综合排名突然消失 编辑:程序博客网 时间:2024/05/20 20:21
一、建立BST节点结构
struct node { int key; node *parent,*left,*right;};
同时定义一个跟节点和一个空节点
node *NIL,*root;
二 、进行插入操作
- 首先判断树中如果没有节点,那么直接将要插入的节点当做根节点,并且设置它的父节点为NIL;
- 如果树中有根节点了,那么定义两个node节点x和y,x指向需要插到的位置,y指向x的父节点;
- 将x初始化,并且插入;
void Insert(int key){ node *y = NIL,*x = root,*z; z = (node *)malloc(sizeof(node)); z->key = key; z->left = z->right = NIL; //注意,在这里root和NIL是相等的 while (x != NIL){ y = x; if (z->key < x->key){ x = x->left; }else x = x->right; } z->parent = y; if (y == NIL){ root = z; }else{ if (z->key < y->key){ y->left = z; }else y->right = z; }}
三、进行查找操作
查找操作很容易,在这里就不赘述了
node *Find(node *u,int key){ while (u != NIL && u->key != key){ if (key < u->key){ u = u->left; }else u = u->right; } return u;}
四、进行删除操作
- 首先看是否能够找到要删除的点
- 将根节点只有一个子树,并且删除根节点的情况提出来单独分析
if (p->parent == NIL && p->left == NIL){ p = p->right;root = p;return;}else if (p->parent == NIL && p->right == NIL){ p = p->left;root = p;return;}
- 接下来针对其他情况进行分析
- p指向的节点的左子树为空
- p指向的节点的右子树为空
- p指向的节点的左右子树都不为空
其中p指向需要删除的节点,q指向p,s指向p的左孩子
前两种情况比较简单直接将p的子树接到p的双亲就行了
对于第三种情况,通过找到要删除节点的直接前驱(或直接后继),然后将直接前驱(或直接后继)的值赋给p指向的节点,然后重接q的子树,之后将s指针free掉就可以了。(其中q一直指向s的双亲,前驱和后继都是相对于中序遍历而言的)
if (p->left == NIL){ if (p == p->parent->left){ q = p;p->parent->left = p->right;free(q); }else{ q = p;p->parent->right = p->right;free(q); } }else if (p->right == NIL){ if (p == p->parent->left){ q = p;p->parent->left = p->left;free(q); }else{ q = p;p->parent->right = p->left;free(q); } }else{ q = p; s = p->left; //找到p的前驱节点 while (s->right != NIL){ q = s; s = s->right; } p->key = s->key; if (q != p){ q->right = s->left; }else{ q->left = s->left; } free(s); }
至此,完成BST的插入,查找和删除操作。
阅读全文
0 0
- 关于BST的插入,查找和删除
- BST的查找、插入、删除
- 二叉搜索树(BST)的创建、插入、查找和删除
- BST的插入和删除
- BST的插入、删除、查找操作
- 手写BST插入查找删除
- BST 插入删除查找遍历
- 动态查找表之二叉排序树(BST)的 创建、查找、插入与删除
- BST二叉排序树的查找和删除的完整C代码
- BST插入、删除、求高和层次遍历的实现
- 二叉搜索树(BST)递归与非递归的插入、删除、查找的实现
- 数据结构基础5.2:二叉搜索树(BST)的基本操作(插入、查找、删除)
- BST 存储结构建立(插入)、删除、 查找算法的实现及应用
- BST二叉搜索树的查找,最大小值,删除,插入
- 二叉排序树的查找、插入和删除
- 二叉排序树的查找、插入和删除
- ArrayList和linkedList的插入、查找、删除
- 二叉查找树节点的查找、插入和删除
- 快速排序--Java实现
- 笔试笔记(四)!
- SpringBoot的理解
- Codeforces 831D Office Keys 贪心or dp
- Struts2(一)
- 关于BST的插入,查找和删除
- 红黑树
- HDU1561
- Aho_Corasick_Automaton
- 文件服务器
- 修改路由
- 北京信息学培训第六天
- 6、debian搭建nfs服务器
- c++注意事项