b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

二叉排序树的创建(3)

电脑杂谈  发布时间:2019-06-24 03:05:37  来源:网络整理
small->r_tree = middle->l_tree;

3、 将small和big分别作为middle的左右子树

对于RR型来说,调整前后big都是作为middle的右子,所以big不用调整

middle->l_tree = small;

4、 将middle作为调整后的根节点,也就是将middle作为parent的孩子

这里要分情况:(对于这一步,四种情况的做法都一样,所以后面就不重复啦!!!!!)

调整部分的具体代码(注意,这里我在每个节点中添加了一个指向其父节点的指针,便于处理)

/**
 * deal_unbalance调用的函数
 * 根据最小非平衡树的类型进行调整,使其平衡
 * unbalance为最小非平衡树的树根
 * type为最小非平衡树的类型
 * root为整棵树的树根,因为这个过程中,整棵树的树根可能都在随时变换
 * */
void adjust(PBNode *root,PBNode unbalance,enum unbalance_type type)
{
         int t = type;
         PBNode small;
         PBNode middle;
         PBNode big;
         switch (t)
         {
                  case TYPE_LL:
                          {
                                   //确定small、middle、big三个节点

                                   big = unbalance;
                                   middle = unbalance->l_tree;
                                   small = unbalance->l_tree->l_tree;
                                  
                                   //分配middle节点的孩子,给small和big

                                   big->l_tree = middle->r_tree;
                                  
                                   //将small和big作为midlle的左子和右子

                                   middle->r_tree = big;
                                   break;
                          }
                  case TYPE_LR:
                          {
                                   //确定small、middle、big三个节点

                                   big = unbalance;
                                   small = unbalance->l_tree;
                                   middle = unbalance->l_tree->r_tree;
 
                                   //分配middle节点的孩子,给small和big

                                   small->r_tree = middle->l_tree;
                                   big->l_tree = middle->r_tree;
 
                                   //将small和big作为midlle的左子和右子

                                   middle->l_tree = small;
                                   middle->r_tree = big;
                                   break;
                          }
                  case TYPE_RL:
                          {
                                   //确定small、middle、big三个节点

                                   small = unbalance;
                                   big = unbalance->r_tree;
                                   middle = unbalance->r_tree->l_tree;
 
                                   //分配middle节点的孩子,给small和big

                                   small->r_tree = middle->l_tree;
                                   big->l_tree = middle->r_tree;
                                  
                                   //将small和big作为midlle的左子和右子

                                   middle->l_tree = small;
                                   middle->r_tree = big;
                                   break;
                          }
                  case TYPE_RR:
                          {
                                   //确定small、middle、big三个节点

                                   small =unbalance;
                                   middle  = unbalance->r_tree;
                                   big = unbalance->r_tree->r_tree;
                                  
                                   //分配middle节点的孩子,给small和big

                                   small->r_tree = middle->l_tree;
                                  
                                   //将small和big作为midlle的左子和右子

                                   middle->l_tree = small;
                                   break;
                          }
 
         }
         //将最小非平衡子树的父亲节点指向middle(也就是将middle,调整后的子树的根结点)
         if(unbalance->parent == NULL)     //说明最小非平衡树的根节点就是整棵树的根结点

         {
                  printf("这里执行了!!!!!\n");
                  *root = middle;
         }
         else if(unbalance->parent->l_tree == unbalance)//根是父亲的左孩子

         {
                  unbalance->parent->l_tree = middle;
 
         }
         else if(unbalance->parent->r_tree == unbalance)//根是父亲的右孩子

         {
                  unbalance->parent->r_tree = middle;
         }
 
         //更改small、middle、big的父亲节点

         middle->parent = unbalance->parent;
         big->parent = middle;
         small->parent = middle;
 
}
 

最后,创建整个二叉平衡树的方法就是:

// 插入新的节点后,为了保持红黑树平衡,对红黑树进行调整。主要是想要一个函数,判断标题前空白部分和|部分的可能交替输出我的想法是这样的:如果该节点有子节,则输出子节点时前面是空白还是|,要判断,判断如下:如果本节点下面有兄弟节点:则输出子节点时,在这级别上,输出|,滞则输出空白,。where节点是判断包含节点有内容就插入where,否则不插入,trim节点是用来判断如果动态语句是以and 或or开始,那么会自动把这个and或者or取掉。

因为它们成为另一棵树的左子叶节点和右子叶节点,且该树的根是它们的频率之后(:11),根将被插入到优先级队列中,现在有两棵huffman树:。因为这个新创建的region实例是要从aa树中的某个节点分出部分空间,因而首先要将aa树中的那个节点从树中移除,然后如果树中移除的节点的end值和新创建的region的end值一样,则直接移除就可以了,否则,要将树种移除的节点剩余部分的重新创建一个region插回树中。最后,删除(:11)与(:14)两个节点,由于这两个节点都存在于已创建好的huffman中,所以这次实质上这次是合并这两个huffman树,最后形成最终的huffman树:。

typedef struct b_node{
         int value;//节点的值
         int deep;//树的深度
         struct b_node *l_tree;//左子树
         struct b_node *r_tree;//右子树
         struct b_node *parent;//父亲节点

} BNode,*PBNode;


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-108009-3.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 钱可复
      钱可复

      有的1000块都还不一定能拍出这效果呢

    • 马强
      马强

      为何有关部门不出来表态

    • 世祖苻坚
      世祖苻坚

      绝大多数的人都不理解谢教授的真正用意

    热点图片
    拼命载入中...