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块都还不一定能拍出这效果呢