template
<class T, class Comp = std::less <T> >
class qtree {
public
:
struct node {
node(const T &t, node *p)
: data(t), parent(p), lchild(0), rchild(0), left_size(0)
{
}
T data;
node *parent;
node *lchild, *rchild;
int
left_size;
};
qtree()
: __head(T(), 0), __size(0)
{
}
node * add(const T &data)
{
node *p = &__head;
while
(1) {
if
(__less_than(data, p)) {
p->left_size += 1;
if
(p->lchild) {
p = p->lchild;
} else {
p->lchild = new
node(data, p);
p = p->lchild;
break
;
}
} else {
if
(p->rchild) {
p = p->rchild;
} else {
p->rchild = new
node(data, p);
p = p->rchild;
break
;
}
}
}
++__size;
return
p;
}
void
remove(node *p)
{
if
(p->lchild && p->rchild) {
__swap_node(p, __min_node(p->rchild));
}
__increase_leaf(p, -1);
node *q = __only_child(p);
*__child_entry(p, p->parent) = q;
if
(q) {
q->parent = p->parent;
}
--__size;
delete
p;
}
node * find(const T &data)
{
node *p = &__head;
while
(p) {
if
(__less_than(data, p)) {
p = p->lchild;
} else if
(__less_than(p, data)) {
p = p->rchild;
} else {
break
;
}
}
return
p;
}
node * at(int
index)
{
node *p = __head.rchild;
while
(p) {
if
(index < p->left_size) {
p = p->lchild;
} else if
(p->left_size < index) {
index -= (p->left_size + 1);
p = p->rchild;
} else {
break
;
}
}
return
p;
}
int
size()
{
return
__size;
}
private
:
bool
__less_than(const T &data, const node *node)
{
if
(node == &__head) return
false;
return
Comp()(data, node->data);
}
bool
__less_than(const node *node, const T &data)
{
if
(node == &__head) return
true
;
return
Comp()(node->data, data);
}
node ** __child_entry(node *p, node *q)
{
return
q->lchild == p ? &q->lchild : &q->rchild;
}
void
__swap_node(node *a, node *b)
{
*__child_entry(a, a->parent) = b;
*__child_entry(b, b->parent) = a;
std::swap(a->parent, b->parent);
std::swap(a->lchild, b->lchild);
std::swap(a->rchild, b->rchild);
std::swap(a->left_size, b->left_size);
if
(a->lchild) {
a->lchild->parent = a;
}
if
(a->rchild) {
a->rchild->parent = a;
}
if
(b->lchild) {
b->lchild->parent = b;
}
if
(b->rchild) {
b->rchild->parent = b;
}
}
node * __min_node(node *p)
{
while
(p->lchild) {
p = p->lchild;
}
return
p;
}
node * __max_node(node *p)
{
while
(p->rchild) {
p = p->rchild;
}
return
p;
}
void
__increase_leaf(node *p, int
increment)
{
while
(p->parent) {
node *q = p->parent;
if
(p == q->lchild) {
q->left_size += increment;
}
p = q;
}
}
node * __only_child(node *p)
{
return
p->lchild ? p->lchild : p->rchild;
}
node __head;
int
__size;
};
分享到:
相关推荐
总之,通过LeetCode的练习,开发者不仅可以深化对二叉搜索树的理解,还能广泛涉猎各种算法和数据结构,提升自己的编程技能。而"managed9df"可能是个人或团队的标识,表示这个资源包是由他们整理并分享的。在学习过程...
数据结构与算法分析期末复习题及答案 本资源提供了数据结构与算法分析的期末复习题及答案,涵盖了数据结构和算法分析的多个方面,包括线性表、栈、队列、二叉树、图、排序算法等。该资源提供了20个选择题和12个运算...
二叉平衡树:若不是空树,则(1)左右子树都是平衡二叉树;(2)左右子树的深度之差的绝对值不超过1。 本次实验是利用二叉排序树和平衡二叉树达到以下目的:(1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉...
在数据结构的学习过程中,第七章主要涉及搜索技术,特别是静态搜索表结构、顺序搜索、折半搜索以及二叉搜索树等内容。以下是本章的重点知识概览: 1. **基本知识点**: - **搜索概念**:理解搜索的基本概念,包括...
本资源主要涉及数据结构的基础知识,涵盖单链表、强连通图、二叉搜索树、哈夫曼树、顺序表、图的存储结构、堆排序、二叉树遍历等多个方面。 单链表部分包括: * 在单链表中插入结点的操作 * 单链表的基本操作 ...
本复习资料“2018级数据结构复习资料_settlersfme_数据结构_数据结构复习”是针对学习者进行期末考试准备的宝贵资源,虽然没有直接的答案,但通过这些资料,学习者可以深入理解和掌握数据结构的基本概念、方法和应用...
华南理工大学的“数据结构复习提纲二”文档无疑为备考的学生提供了宝贵的资源,涵盖了重要的概念、问题及其解答。在这个复习提纲中,我们可以期待找到关于以下关键知识点的详细内容: 1. **基本概念**:数据结构是...
这份“数据结构复习题及答案”压缩包提供了丰富的学习材料,帮助学习者巩固和理解数据结构的基本概念、算法及其应用。 1. **基本概念** - **数据结构**:数据结构是指数据的组织方式,包括数组、链表、栈、队列、...
- 树的特殊类型:二叉搜索树、完全二叉树、满二叉树、平衡树。 - 图的遍历:深度优先搜索和广度优先搜索。 - 图的性质:连通性、环检测、最短路径算法(Dijkstra、Floyd-Warshall等)。 五、数据结构的总复习 1. ...
AVL树是一种自平衡二叉搜索树,保证了查找、插入和删除操作的时间复杂度为O(log n)。图由节点和边组成,可以表示复杂的关联关系,如图的遍历和最短路径问题。 此外,还有散列表(哈希表),它通过散列函数将关键字...
5. **二叉搜索树(BST)**:二叉搜索树的特点是左子树所有节点小于根节点,右子树所有节点大于根节点。掌握BST的插入、查找算法,以及如何构造和删除BST节点。 6. **AVL树**:AVL树是自平衡的二叉搜索树,任何节点的...
二叉搜索树(BST)、平衡二叉树(AVL、红黑树)和堆(最大堆、最小堆)是二叉树的重要变体,它们在搜索、排序等方面有着广泛应用。 5. **图**:图由顶点和边组成,用于表示实体间的关系。图可以是无向的或有向的,...
6. 树和二叉树:这是非常重要的章节,涵盖了二叉搜索树、平衡树(AVL、红黑树等)、树的遍历、树的构造和分解等。二叉树的算法设计题通常难度较高。 7. 图:图是表示对象间关系的结构,包括图的遍历(深度优先搜索...
### 数据结构复习题知识点解析 #### 一、判断题知识点解析 1. **线性表的逻辑顺序与物理顺序** - **知识点**: 线性表的基本概念、逻辑顺序与物理顺序的区别 - **解析**: 线性表是一种常见的数据结构,其中的数据...
### 数据结构C语言版复习题知识点解析 #### 单选题知识点分析 **1. 链表操作** - **知识点**: 在单链表中,向表头插入节点的操作涉及改变链表头指针指向的新节点,并更新新节点的指针指向原链表的第一个节点。 - *...
二叉搜索树(BST)允许快速查找、插入和删除操作。此外,还有完全二叉树、满二叉树和平衡树(如AVL树、红黑树)等。 5. **图**:图由节点和边构成,可以表示多种复杂关系。图的遍历包括深度优先搜索(DFS)和广度...
本段内容首先总结了数据结构的一些基础知识,随后通过一系列例题展示了数据结构在实际...综合来看,文档所涵盖的内容是数据结构学习的重要部分,不仅包括理论知识,还涉及具体的实现和应用,适合期末复习时参考和练习。
这部分内容可能是为了让学生了解如何在实际编程中应用数据结构,通过阅读和理解源代码,可以学习到如何在C++、Java或Python等语言中实现各种数据结构,例如链表、队列、栈的实现,或者二叉搜索树、红黑树等高级数据...
在复习这个压缩包中的真题和答案时,考生应该着重理解这些基本概念,掌握各种树的性质,熟练运用树的遍历算法,并能够解决实际问题,如构建和操作二叉搜索树、平衡树等。同时,熟悉并能灵活运用这些知识点在编程实践...