数据结构-二叉搜索树
2016-04-14 16:40
344 查看
二叉搜索树的所有节点都满足左子树上的所有节点都比自己小,而右子树上的所有节点都比自己大这一条件。
当删除某个节点时,需要根据下面几种情况分别进行处理:
需要删除的节点没有左儿子,那么就把右儿子提上去。
需要删除的节点的左儿子没有右儿子,那么就把左儿子提上去。
以上两种情况都不满足的话,就把左儿子的子孙(左子树)中最大的节点提到需要删除的节点上。
当删除某个节点时,需要根据下面几种情况分别进行处理:
需要删除的节点没有左儿子,那么就把右儿子提上去。
需要删除的节点的左儿子没有右儿子,那么就把左儿子提上去。
以上两种情况都不满足的话,就把左儿子的子孙(左子树)中最大的节点提到需要删除的节点上。
struct node { int val; node *lch, *rch; }; node *insert(node *p, int x) { if (p == NULL) { node *q = new node; q->val = x; q->lch = q->rch = NULL; return q; } else { if (x < p->val) p->lch = insert(p->lch, x); else p->rch = insert(p->rch, x); return p; } } bool find(node *p, int x) { if (p == NULL) return false; else if (x == p->val) return true; else if (x < p->val) return find(p->lch, x); else return find(p->rch, x); } node *remove(node *p, int x) { if (p == NULL) return NULL; else if (x < p->val) p->lch = remove(p->lch, x); else if (x > p->val) p->rch = remove(p->rch, x); else if (p->lch == NULL) { node *q = p->rch; delete p; return q; } else if (p->lch->rch == NULL) { node *q = p->lch; q->rch = p->rch; delete p; return q; } else { node *q; for (q = p->lch; q->rch->rch != NULL; q = q->rch) { ; } node *r = q->rch; q->rch = r->lch; r->lch = p->lch; r->rch = p->rch; delete p; return r; } return p; }
相关文章推荐
- 数据结构:hash_map原理
- 数据结构与算法——优先队列类的C++实现(二叉堆)
- 浅谈算法和数据结构: 七 二叉查找树
- 数据结构笔记整理第2章:线性表
- 模板复习计划——线性与半线性数据结构维护
- 【数据结构与算法设计】希尔排序
- 数据结构第一章
- 线性表顺序存储结构实现(线性表-数据结构作业)
- C/C++基础知识02---数据结构
- 数据结构知识点总结
- 数据结构(并查集):COGS 260. [NOI2002] 银河英雄传说
- 【数据结构】Orthogonal-List 十字链表(更新时间:2016-04-15)
- 数据结构Step by Step之树(1)- 二叉树 前序、中序、后序 LeetCode105根据前序中序的顺序构造树
- 数据结构--单向链表C实现
- 数据结构之栈
- 【数据结构】Doubly-Linked List双向链表(更新时间:2016-04-13)
- lightoj 1085
- HashMap的数据结构
- 数据结构学习笔记(七)--图
- 数据结构与算法习题汇总(3)