数据结构2019-11-29

   堆也被称为优先队列,队列是先进先出,队尾插入,队头删除,而堆也是堆底插入,堆顶删除。

    栈先进后出,栈顶插入和删除。它是一种运算受限的线性表。

队列

    队列是先进先出,队尾插入,队头删除。动态的创建,动态是否,因而不存在溢出问题。

散列表

    又称哈希表,是把关键码根据映射函数映射到表中一个地址中,以加快查找速度。

    散列地址冲突

        是因为多个关键码的映射地址相同。

    解决方法            

         开放地址法:出现冲突,顺序的寻找写一个地址是否冲突,不冲突则放入,否则,继续向下寻找。

          链地址法:每个哈希地址单元为一个同义链表,来维护相同地址的关键码。

二叉树

          第i层最大为2^(i-1),深度为k的二叉树最多有2^k-1  个结点,n个结点高度至少log2(n+1)。任一棵二叉树,n0=n2+1。

          前序遍历:

            //二叉树前序遍历递归

void PreOrder(TreeNode* root)

{

    if(root)

    {

        cout << root->val << endl;

        PreOrder(root->left);

        PreOrder(root->right);

    }

}

//二叉树前序遍历非递归

void PreOrder(TreeNode* root)

{

    stack<TreeNode*> s;

    while(root != nullptr || !s.emtpy())

    {

        if(root)

        {

            s.push(root);

            cout << root->val << endl;

            root = root->left;

        }

        else

        {

            root = s.top();

            s.pop();

            if(root)

            {

                root = root->right;

            }

        }

    }

}

            中序遍历:

//二叉树中序遍历递归

void InOrder(TreeNode* root)

{

    if(root)

    {

        InOrder(root->left);

        cout << root->val << endl;

        InOrder(root->right);

    }

}

//二叉树中序遍历非递归

void InOrder(TreeNode* root)

{

    stack<TreeNode*> s;


        while(root)

        {

            s.push(root);

            root = root->left;

        }

        if(!s.empty())

        {

            root = s.top();

            cout << root->val << endl;

            s.pop();

            if(root)

            {

                root = root->right;

            }

        }

}

    后序遍历:

//二叉树后序遍历递归

void PostOrder(TreeNode* root)

{

    if(root)

    {

        PostOrder(root->left);

        PostOrder(root->right);

        cout << root->val << endl;

    }

}

//二叉树后序遍历非递归

void PostOrder(TreeNode* root)

{

    TreeNode* cur;

    TreeNode* pre = nullptr;

    stack<TreeNode*> s;


        if(root)

        {

            s.push(root);

        }

        while(!s.empty())

        {

            cur = s.top();

            if(cur->left == nullptr && cur->right == nullptr || pre && (cur->left == pre || cur->right == pre))

            {

                cout << cur->val << endl;

                pre = cur;

                s.pop();

            }

            else

            {

                if(cur->right)

                {

                    s.push(cur->right);

                }

                if(cut->left)

                    s.push(cur->left);

            }

        }

}

        层次遍历:

//层次遍历

void LevelOrder(TreeNode* root)

{

    if(root == nullptr)

        return;

    queue<TreeNode*> q;

    if(root)

        q.push(root);

    while(!q.empty())

    {

        TreeNode* tmp = q->front();

        cout << tmp->val << endl;

        q.pop();

        if(tmp->left)

        {

            q.push(tmp->left);

        }

        if(tmp->right)

        {

            q.push(tmp->right);

        }

    }

}

二叉查找树:

        又称二叉搜索树,二叉排序树。即中序遍历有序,若左子树不空,则左子树的值都小于根结点的值,若右子树不空,右子树的值都大于根结点,不存在值相同的结点。

完全二叉树:

        只有最小两层的结点度小于2,且全都左连续。

平衡二叉树:

        每个结点的左子树和右子树高度差不超过1。

b 树、b+ 树

        首先 b 树属于多叉树又名平衡多路查找树

其规则是

所有节点关键字是按递增顺序排列,并遵循左小右大规则

子节点数,非叶子节点的子节点数大于 1 且小于 M,且 M > 2,空树除外

关键字数,枝接点的关键字数量大于等于 ceil(m/2)-1 个且小于等于 M-1 个(注:ceil() 是个朝正无穷方向取整的函数,比如 ceil(1,1) = 2)

叶节点的指针为空且叶节点具有相同的深度

        而对于 b+ 树,是 b 树的一个升级版,相对于 b 树而言 b+ 树更充分利用了节点的空间,让查询速度更加稳定,其速度完全接近二分查找。

红黑树:

        一种特殊的二叉查找树。

       特性:

            1、每个结点非红即黑。

            2、根结点黑色。

            3、每个叶子结点黑色。

            4、若结点为红色,其子节点为黑色。

            5、从一个结点到该子孙结点的所有路径上包含相同数目的黑结点。

         红黑树的基本操作

红黑树的基本操作是添加、删除,在对红黑树进行添加删除之后,都会用到旋转方法(之所以要进行旋转,是因为要在插入删除后还必须满足红黑树的性质)

            左旋


            右旋


红黑树如何进行插入删除?

插入

如果父节点为黑色,直接插入不处理

如果父节点为红色,叔叔节点为红色,则父节点和叔叔节点变为黑色,祖先节点变为红色,将节点操作转换为祖先节点

如果当前节点为父亲节点的右节点,则以父亲结点为中心左旋操作

如果当前节点为父亲节点的左节点,则父亲节点变为黑色,祖先节点变为红色,以祖先节点为中心右旋操作

删除

先按照排序二叉树的方法,删除当前节点,如果需要转移即转移到下一个节点

当前节点,必定为这样的情况:没有左子树。

删除为红色节点,不需要处理,直接按照删除二叉树节点一样

如果兄弟节点为黑色,兄弟节点的两个子节点为黑色,则将兄弟节点变为红色,将着色转移到父亲节点

如果兄弟节点为红色,将兄弟节点设为黑色,父亲结点设为红色节点,对父亲结点进行左旋操作

如果兄弟节点为黑色,左孩子为红色,右孩子为黑色,对兄弟节点进行右旋操作

如果兄弟节点为黑色,右孩子为红色,则将父亲节点的颜色赋值给兄弟节点,将父亲节点设置为黑色,将兄弟节点的右孩子设为黑色,对父亲节点进行左旋

红黑树、b 树、b+ 树区别

红黑树的深度比较大,而B+和B-的深度则相对要小一些,而B+较B-则将数据都保存在叶子节点,同时通过链表的形式将他们连接在一起。

算法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容