`
gstarwd
  • 浏览: 1539037 次
  • 性别: 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. **基本知识点**: - **搜索概念**:理解搜索的基本概念,包括...

    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

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

    数据结构复习之运算操作题答案.doc

    在这个复习文档中,主要涵盖了关于栈和队列的数据结构以及二叉搜索树的相关运算操作。 首先,我们来看栈的操作。栈是一种后进先出(LIFO)的数据结构,即最后进入的元素最先出来。题目中给出了四个具体的序列生成...

Global site tag (gtag.js) - Google Analytics