`
gstarwd
  • 浏览: 1525320 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

数据结构复习:二叉搜索树

阅读更多
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;
};

分享到:
评论

相关推荐

    编程题型_managed9df_leetcode_二叉搜索树的判断_

    总之,通过LeetCode的练习,开发者不仅可以深化对二叉搜索树的理解,还能广泛涉猎各种算法和数据结构,提升自己的编程技能。而"managed9df"可能是个人或团队的标识,表示这个资源包是由他们整理并分享的。在学习过程...

    数据结构与算法分析—期末复习题及答案.pdf

    数据结构与算法分析期末复习题及答案 本资源提供了数据结构与算法分析的期末复习题及答案,涵盖了数据结构和算法分析的多个方面,包括线性表、栈、队列、二叉树、图、排序算法等。该资源提供了20个选择题和12个运算...

    二叉排序树与平衡二叉树的实现

    二叉平衡树:若不是空树,则(1)左右子树都是平衡二叉树;(2)左右子树的深度之差的绝对值不超过1。 本次实验是利用二叉排序树和平衡二叉树达到以下目的:(1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉...

    数据结构第7章复习重点.doc

    在数据结构的学习过程中,第七章主要涉及搜索技术,特别是静态搜索表结构、顺序搜索、折半搜索以及二叉搜索树等内容。以下是本章的重点知识概览: 1. **基本知识点**: - **搜索概念**:理解搜索的基本概念,包括...

    南邮数据结构C语言期末复习

    本资源主要涉及数据结构的基础知识,涵盖单链表、强连通图、二叉搜索树、哈夫曼树、顺序表、图的存储结构、堆排序、二叉树遍历等多个方面。 单链表部分包括: * 在单链表中插入结点的操作 * 单链表的基本操作 ...

    2018级数据结构复习资料_settlersfme_数据结构_数据结构复习_

    本复习资料“2018级数据结构复习资料_settlersfme_数据结构_数据结构复习”是针对学习者进行期末考试准备的宝贵资源,虽然没有直接的答案,但通过这些资料,学习者可以深入理解和掌握数据结构的基本概念、方法和应用...

    华南理工大学数据结构复习提纲二

    华南理工大学的“数据结构复习提纲二”文档无疑为备考的学生提供了宝贵的资源,涵盖了重要的概念、问题及其解答。在这个复习提纲中,我们可以期待找到关于以下关键知识点的详细内容: 1. **基本概念**:数据结构是...

    数据结构复习题及答案

    这份“数据结构复习题及答案”压缩包提供了丰富的学习材料,帮助学习者巩固和理解数据结构的基本概念、算法及其应用。 1. **基本概念** - **数据结构**:数据结构是指数据的组织方式,包括数组、链表、栈、队列、...

    数据结构复习 方便你的数据机构复习

    - 树的特殊类型:二叉搜索树、完全二叉树、满二叉树、平衡树。 - 图的遍历:深度优先搜索和广度优先搜索。 - 图的性质:连通性、环检测、最短路径算法(Dijkstra、Floyd-Warshall等)。 五、数据结构的总复习 1. ...

    数据结构复习代码

    AVL树是一种自平衡二叉搜索树,保证了查找、插入和删除操作的时间复杂度为O(log n)。图由节点和边组成,可以表示复杂的关联关系,如图的遍历和最短路径问题。 此外,还有散列表(哈希表),它通过散列函数将关键字...

    数据结构期末考试复习题

    5. **二叉搜索树(BST)**:二叉搜索树的特点是左子树所有节点小于根节点,右子树所有节点大于根节点。掌握BST的插入、查找算法,以及如何构造和删除BST节点。 6. **AVL树**:AVL树是自平衡的二叉搜索树,任何节点的...

    数据结构复习资料及试卷(c++版)

    二叉搜索树(BST)、平衡二叉树(AVL、红黑树)和堆(最大堆、最小堆)是二叉树的重要变体,它们在搜索、排序等方面有着广泛应用。 5. **图**:图由顶点和边组成,用于表示实体间的关系。图可以是无向的或有向的,...

    数据结构复习重点归纳

    6. 树和二叉树:这是非常重要的章节,涵盖了二叉搜索树、平衡树(AVL、红黑树等)、树的遍历、树的构造和分解等。二叉树的算法设计题通常难度较高。 7. 图:图是表示对象间关系的结构,包括图的遍历(深度优先搜索...

    数据结构复习题(含答案)

    ### 数据结构复习题知识点解析 #### 一、判断题知识点解析 1. **线性表的逻辑顺序与物理顺序** - **知识点**: 线性表的基本概念、逻辑顺序与物理顺序的区别 - **解析**: 线性表是一种常见的数据结构,其中的数据...

    数据结构C语言版复习题

    ### 数据结构C语言版复习题知识点解析 #### 单选题知识点分析 **1. 链表操作** - **知识点**: 在单链表中,向表头插入节点的操作涉及改变链表头指针指向的新节点,并更新新节点的指针指向原链表的第一个节点。 - *...

    数据结构 考试 试卷 数据结构期末复习

    二叉搜索树(BST)允许快速查找、插入和删除操作。此外,还有完全二叉树、满二叉树和平衡树(如AVL树、红黑树)等。 5. **图**:图由节点和边构成,可以表示多种复杂关系。图的遍历包括深度优先搜索(DFS)和广度...

    数据结构期末复习例题

    本段内容首先总结了数据结构的一些基础知识,随后通过一系列例题展示了数据结构在实际...综合来看,文档所涵盖的内容是数据结构学习的重要部分,不仅包括理论知识,还涉及具体的实现和应用,适合期末复习时参考和练习。

    数据结构复习试卷

    这部分内容可能是为了让学生了解如何在实际编程中应用数据结构,通过阅读和理解源代码,可以学习到如何在C++、Java或Python等语言中实现各种数据结构,例如链表、队列、栈的实现,或者二叉搜索树、红黑树等高级数据...

    02331自考真题数据结构及答案.zip

    在复习这个压缩包中的真题和答案时,考生应该着重理解这些基本概念,掌握各种树的性质,熟练运用树的遍历算法,并能够解决实际问题,如构建和操作二叉搜索树、平衡树等。同时,熟悉并能灵活运用这些知识点在编程实践...

Global site tag (gtag.js) - Google Analytics