范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

最透彻的红黑树详解(图文并茂,一文全解)

  前言
    刚开始接触红黑树的时候,感觉很难。其实不然,红黑树只是情况分的多了一点而已,相较于线段树,主席树等等,简单多了。对于红黑树3种插入维护4种删除维护没必要去记忆,稍作了解,对于红黑树的性质和特点,需要特别记忆。
    本专栏知识点是通过零声教育的线上课学习,进行梳理总结写下文章,对c/c++linux课程感兴趣的读者,可以点击链接:C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂课程介绍详细查看课程的服务。
  注意,本文图中红黑树的叶子结点默认不画出来~为什么要有红黑树二叉搜索树
    二叉搜索树(又叫二叉排序树,BST):对于任意一个结点,其左子树的值必定小于该结点,其右子树的值必定大于该结点。那么中序遍历的时候,就是有序的了。理论上来说,增加,删除,修改的时间复杂度都是O(log(N))。但是它存在一个致命的问题。
    退化:向树中插入[1,2,3,4,5,6],此时树退化成了一个链表,增加,删除,修改的时间复杂度退化为O(N)
  添加图片注释,不超过 140 字(可选)平衡二叉搜索树
    平衡二叉搜索树(AVL Tree):它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉搜索树。如果向树中插入[1,2,3,4,5,6]
  添加图片注释,不超过 140 字(可选)
  可以看到AVLTree在最坏的情况下,依然保持了"绝对的平衡":左右两个子树的高度差的绝对值不超过1。那么AVL Tree是如何保证平衡的呢,是通过旋转,可以看到,无论是插入还是删除元素,都要去通过旋转维护整个树的平衡。AVL查询元素:O(log(N))AVL插入元素:最多一次旋转O(1),加上查询的时间O(log(N)),插入的复杂度O(log(N))AVL删除元素:必须检查从删除结点开始到根结点路径上的所有结点的平衡因子。因此删除的代价比较大,删除最多需要log(N)次旋转,加上查询的时间,删除的复杂度O(2log(N))红黑树
    我们发现,AVL树未免太严格了一些,有没有一种数据结构,能让AVL树不那么严格平衡,降低维护平衡的开销,同时又不能像BST一样退化呢?
  当然有,就是本文所写的红黑树(rbTree):rbTree查询元素:O(log(N))rbTree插入元素:插入最多2次旋转,加上查询的时间O(log(N)),插入的复杂度O(log(N))rbTree删除元素:删除最多需要3次旋转,加上查询的时间,删除的复杂度O(log(N))
    虽然插入和删除元素后,需要旋转和变色(本文中统一为维护),但是这一时间复杂度可以估算为O(1)不计
    因为rbTree的第6条性质(见下文)所以红黑树的查询效率略低与AVL的查询红黑树和AVL插入的速度差不多红黑树删除的速度比AVL快,因为AVL删除最多需要og(N)次旋转红黑树的应用场景c++ stl map,set(红黑树的封装)进程调度cfs(用红黑树存储进程的集合,把调度的时间作为key,那么树的左下角时间就是最小的)内存管理(每次使用malloc的时候都会分配一块小内存出来,那么这么块就是用红黑树来存,如何表述一段内存块呢,用开始地址+长度来表示,所以key->开始地址,val->大小)epoll中使用红黑树管理socketfdnginx中使用红黑树管理定时器,中序遍历第一个就是最小的定时器红黑树的性质(重点)每个结点是红的或者黑的根结点是黑的每个叶子结点是黑的(因为这条性质,一般用叶子结点在代码中被特殊表示)如果一个结点是红的,则它的两个儿子都是黑的(不存在相邻红色)从任一节点到叶子节点,所包含的黑色节点数目相同(即黑高度相同)最长路径长度不超过最短路径长度的2倍(2n-1,一条黑红黑红…一条全黑)红黑树的定义#define RED 0 #define BlACK 1  typedef int KEY_TYPE;  typedef struct _rbtree_node {     unsigned char color;//颜色     struct _rbtree_node *left;//左子树     struct _rbtree_node *right;//右子树     struct _rbtree_node *parent;//父结点     KEY_TYPE key;     void *value;  } rbtree_node;//红黑树结点  typedef struct _rbtree {     rbtree_node *root;//根结点     rbtree_node *nil;//通用叶子结点 } rbtree;//红黑树红黑树的左旋与右旋
  动三个方向,改6个指针。 通过旋转,调整左右高度,使树达到平衡。
  添加图片注释,不超过 140 字(可选)
  左旋leftRotate(T,x)—中右->左中
  降低X结点的高度,提高X结点右结点(即Y)的高度。x的右子树指向y的左子树本来指向x结点的父指针,改成指向yy的左子树指向x结点
  添加图片注释,不超过 140 字(可选)
  右旋rightRotate(T,y)—中左->中右
  降低Y结点的高度,提高Y结点左结点(即X)的高度。y的左子树指向x的右子树本来指向y结点的父指针,改成指向xx的右子树指向y结点
  添加图片注释,不超过 140 字(可选)//左旋leftRotate(T,x)---中右->左中 //降低X结点的高度,提高X结点右结点(即Y)的高度。 void _left_rotate(rbtree *T, rbtree_node *x) {     rbtree_node *y = x->right;     //1     x->right = y->left;//x的右子树指向y的左子树     if (y->left != T->nil) {         y->left->parent = x;//y的左子树的父节点指向x     }     //2     y->parent = x->parent;//y的父结点指向x的父结点     if (x->parent == T->nil) {//如果x是根结点         T->root = y;     } else if (x == x->parent->left) {         x->parent->left = y;//本来指向x结点的父指针,改成指向y     } else {         x->parent->right = y;     }     //3     y->left = x;//y的左子树指向x结点     x->parent = y;//x的父节点指向y }  //右旋 //copy左旋的代码 //left改成right,right改成left //x改成y,y改成x void _right_rotate(rbtree *T, rbtree_node *y) {     rbtree_node *x = y->left;     //1     y->left = x->right;     if (x->right != T->nil) {         x->right->parent = y;     }     //2     x->parent = y->parent;     if (y->parent == T->nil) {         T->root = x;     } else if (y == y->parent->right) {         y->parent->right = x;     } else {         y->parent->left = x;     }     //3     x->right = y;     y->parent = x; }红黑树插入结点与插入维护红黑树的三种情况插入结点
    在插入结点时,我们始终认为"插入这个结点之前,原来的红黑树是满足红黑树性质的==",那么插入的位置容易找,就是不断的对比key,最终找到位置,那么新增的结点是什么颜色呢?我们通过性质发现:如果新结点是黑色,违背了第5条性质如果新结点是红色,可能违背第4条性质
  而第四条性质,我们可以通过旋转与上色的方式修复,所以在我们插入结点的时候,我们始终认为新结点是红色//因为传入的key可能是字符,可能是整形,所以要提取出来 //这里可以看出,其实可以封装成一个模板 int key_compare(KEY_TYPE a, KEY_TYPE b) {     //这里假设是int     if (a > b) {         return 1;     } else if (a < b) {         return -1;     } else {         return 0;     } } void rbtree_insert(rbtree *T, rbtree_node *z) {     //找位置     rbtree_node *x = T->root;     rbtree_node *y = T->nil;//y是x的父节点     while (x != T->nil) {//二分找位置         y = x;         if (key_compare(z->key, x->key) < 0) {             x = x->left;         } else if (key_compare(z->key, x->key) > 0) {             x = x->right;         } else {             //如果key相等,看自己的业务情景             //重复插入可以不修改直接退出,可以修改val             return;         }     }     //插入     z->parent = y;     if (y == T->nil) {         T->root = z;     } else if (key_compare(z->key, y->key) < 0) {         y->left = z;     } else {         y->right = z;     }      z->left = T->nil;     z->right = T->nil;     z->color = RED;     //维护红黑树     rbtree_insert_fixup(T, z); }插入结点后维护红黑树
    我们知道新增结点是红色,如果新结点是父节点也是红色,那么就需要维护红黑树了。
    如果父结点是爷结点是左子树,可以归纳出来三种情况。同理如果父结点是爷结点是右子树,我们也可以归纳出来三种情况。但是这三种情况的差异就是旋转方向的区别而已。一共是6种情况,但是归纳出来其实是3种,读者不要搞错了。
  在下面的图中:z表示新增结点,y表示叔结点父结点是爷结点是左子树1. 叔结点是红色的将叔结点和父结点变黑,爷结点变红将当前结点变成爷结点(因为爷结点是红,爷结点的父节点也可能是红,所以要递归维护)
  添加图片注释,不超过 140 字(可选)2. 叔结点是黑色的且新结点是左子树将父结点变成黑色,爷结点变成红色以爷结点为中心右旋
  添加图片注释,不超过 140 字(可选)3. 叔结点是黑色的且新结点是右子树以父结点为中心左旋将父结点变黑色,爷结点变红色以爷结点为中心右旋
  添加图片注释,不超过 140 字(可选)父结点是爷结点是右子树1. 叔结点是红色的将叔结点和父结点变黑,爷结点变红将当前结点变成爷结点(因为爷结点是红,爷结点的父节点也可能是红,所以要递归维护)
  添加图片注释,不超过 140 字(可选)2. 叔结点是黑色的且新结点是左子树以父结点为中心右旋将父结点变黑色,爷结点变红色以爷结点为中心左旋
  添加图片注释,不超过 140 字(可选)3. 叔结点是黑色的且新结点是右子树将父结点变成黑色,爷结点变成红色以爷结点为中心左旋
  添加图片注释,不超过 140 字(可选)维护代码//修复第4条性质 void rbtree_insert_fixup(rbtree *T, rbtree_node *z) {     while (z->parent->color == RED) {//父结点是红色的,需要调整         if (z->parent == z->parent->parent->left) {//如果父结点是爷结点是左子树             rbtree_node *y = z->parent->parent->right;//叔结点             if (y->color == RED) {//叔结点是红色的                 //先变色,叔,父变黑                 z->parent->color = BLACK;                 y->color = BLACK;                 //爷结点变红                 z->parent->parent->color = RED;                 //下面的调整完了,调整上面                 z = z->parent->parent;             } else {//叔父结点是黑色                 if (z == z->parent->right) {//新节点是在右边                     z = z->parent;                     rbtree_left_rotate(T, z);                 }                 z->parent->color = BLACK;                 z->parent->parent->color = RED;                 rbtree_right_rotate(T, z->parent->parent);             }         } else {             // 如果父结点是爷结点是右子树             rbtree_node *y = z->parent->parent->left;//叔父结点             if (y->color == RED) {//叔父结点是红色的                 //先变色,叔,父变黑                 z->parent->color = BLACK;                 y->color = BLACK;                 //爷结点变红                 z->parent->parent->color = RED;                 //下面的调整完了,调整上面                 z = z->parent->parent;             } else {//叔父结点是黑色                 if (z == z->parent->left) {//新节点是在左边                     z = z->parent;                     rbtree_right_rotate(T, z);                 }                 z->parent->color = BLACK;                 z->parent->parent->color = RED;                 rbtree_left_rotate(T, z->parent->parent);             }         }     }     //最后别忘了根节点始终是黑色     T->root->color = BLACK; }红黑树删除结点与删除维护红黑树的四种情况删除结点
  我们定义:覆盖结点:z(被指定删除的结点,实际上被覆盖)删除结点:y(实际上被删除的结点,一般是后继结点)轴心结点:x(维护红黑树的结点)
  红黑树删除结点根据改结点的左右子树分为三种情况:没有左右子树有且仅有一个子树左右子树都有
  对不同情况的处理:情况1:直接删除该结点情况2:将该结点的唯一子树挂到父结点上,然后删除该结点情况3:找一个删除结点y(后继结点)覆盖 指定结点z,然后删除 删除结点y,对于这个删除结点y来说,它的情况一定是情况1或情况2删除代码rbtree_node *rbtree_mini(rbtree *T, rbtree_node *x) {     while (x->left != T->nil) {         x = x->left;     }     return x; }  //找后继结点 rbtree_node *rbtree_successor(rbtree *T, rbtree_node *x) {     rbtree_node *y = x->parent;     //右子树不为空,则找右子树中最左的元素     if (x->right != T->nil) {         return rbtree_mini(T, x->right);     }     //找到结点第一个父结点     while ((y != T->nil) && (x == y->right)) {         x = y;         y = y->parent;     }     return y; }  //覆盖结点z //删除结点y //轴心结点x rbtree_node *rbtree_delete(rbtree *T, rbtree_node *z) {     rbtree_node *y = T->nil;     rbtree_node *x = T->nil;      if ((z->left == T->nil) || (z->right == T->nil)) {         y = z;//如果没有孩子或只有一个     } else {//如果有两个子树则找后继         y = rbtree_successor(T, z);     }     //一般x是y的右子树,找到轴心结点     if (y->left != T->nil) {         x = y->left;     } else if (y->right != T->nil) {         x = y->right;     }     //将该结点的唯一子树挂到父结点上,然后删除该结点     x->parent = y->parent;     if (y->parent == T->nil) {//根结点         T->root = x;     } else if (y == y->parent->left) {         y->parent->left = x;     } else {         y->parent->right = x;     }     //进行覆盖操作     if (y != z) {         z->key = y->key;         z->value = y->value;     }     //黑色才需要调整     if (y->color == BLACK) {         rbtree_delete_fixup(T, x);     }     return y; }删除结点后维护红黑树
    想一想,删除一个结点,该结点是什么颜色的时候才需要维护红黑树呢?如果是红色,没有违反任何性质。所以如果是红色直接删除即可,无需维护如果是黑色,黑色被删除,那么必定违反第5条性质,破坏了黑高,所以我们需要针对这一情况进行维护
    如果当前结点是父结点的左子树的情况,可以归纳出来四种情况。同理如果当前结点是父结点的右子树,我们也可以归纳出来四种情况。但是这四种情况的差异就是旋转方向的区别而已(镜像的)。一共是8种情况,但是归纳出来其实是4种,读者不要搞错了。当前结点是父结点的左子树的情况1.当前结点的兄弟结点是红色的兄弟节点变成黑色父节点变成红色父节点做左旋将兄弟结点调整为父节点的右子树
  添加图片注释,不超过 140 字(可选)2. 当前结点的兄弟结点是黑色的,而且兄弟结点的两个孩子结点都是黑色的兄弟节点变成红色轴心结点变为父节点
  添加图片注释,不超过 140 字(可选)3. 当前结点的兄弟结点是黑色的,而且兄弟结点的左孩子是红色的,右孩子是黑色的将左孩子涂黑将兄弟节点变红对兄弟节点右旋将兄弟结点调整为父节点的右子树现在情况3就会变成情况4,接着做情况4的步骤
  添加图片注释,不超过 140 字(可选)4. 当前结点的兄弟结点是黑色的,而且兄弟结点的左孩子是黑色的,右孩子是红色的将兄弟节点换成父节点的颜色把父节点和兄弟节点的右孩子涂黑对父节点做左旋设置x指针,指向根节点
  添加图片注释,不超过 140 字(可选)当前结点是父结点的右子树的情况1. 当前结点的兄弟结点是红色的兄弟节点变成黑色父节点变成红色父节点做右旋将兄弟结点调整为父节点的左子树2. 当前结点的兄弟结点是黑色的,而且兄弟结点的两个孩子结点都是黑色的兄弟节点变成红色轴心结点变为父节点3. 当前结点的兄弟结点是黑色的,而且兄弟结点的左孩子是黑色的,右孩子是红色的将右孩子变黑将兄弟节点变红对兄弟结点左旋将兄弟结点调整为父节点的左子树现在情况3就会变成情况4,接着做情况4的步骤4. 当前结点的兄弟结点是黑色的,而且兄弟结点的左孩子是红色的,右孩子是黑色的将兄弟节点换成父节点的颜色把父节点和兄弟节点的左孩子变黑对父节点做右旋将轴心结点调整为根结点维护代码void rbtree_delete_fixup(rbtree *T, rbtree_node *x) {     //如果x是红色,变成黑色,如果x是黑色,需要调整     while ((x != T->root) && (x->color == BLACK)) {         //当前结点是父结点的左子树         if (x == x->parent->left) {             //兄弟节点             rbtree_node *w = x->parent->right;             // 情况1:兄弟节点为红色             if (w->color == RED) {                 // 兄弟节点变成黑色                 w->color = BLACK;                 // 父节点变成红色                 x->parent->color = RED;                 // 父节点做左旋                 rbtree_left_rotate(T, x->parent);                 //将兄弟结点调整为父节点的右子树                 w = x->parent->right;             }             // 情况2:兄弟节点是黑色的,且兄弟的左孩子和右孩子都是黑色             if ((w->left->color == BLACK) && (w->right->color == BLACK)) {                 // 兄弟节点变成红色                 w->color = RED;                 // 轴心结点变为父节点                 x = x->parent;             } else {                 // 情况3:x的兄弟节点是黑色的,兄弟的左孩子是红色,右孩子是黑色                 if (w->right->color == BLACK) {                     // 将左孩子涂黑                     w->left->color = BLACK;                     // 将兄弟节点变红                     w->color = RED;                     // 对兄弟节点右旋                     rbtree_right_rotate(T, w);                     // 重新设置x的兄弟节点                     w = x->parent->right;                 }                 // 情况4:x的兄弟节点是黑色;x的兄弟节点的右孩子是红色的                 // 将兄弟节点换成父节点的颜色                 w->color = x->parent->color;                 // 把父节点和兄弟节点的右孩子涂黑                 x->parent->color = BLACK;                 w->right->color = BLACK;                 // 对父节点做左旋                 rbtree_left_rotate(T, x->parent);                 // 设置x指针,指向根节点                 x = T->root;             }          } else {//当前结点是父结点的右子树             //兄弟节点             rbtree_node *w = x->parent->left;             //情况1:兄弟结点为红色             if (w->color == RED) {                 // 兄弟节点变成黑色                 w->color = BLACK;                 // 父节点变成红色                 x->parent->color = RED;                 // 父节点做右旋                 rbtree_right_rotate(T, x->parent);                 //将兄弟结点调整为父节点的左子树                 w = x->parent->left;             }             // 情况2:兄弟节点是黑色的,且兄弟的左孩子和右孩子都是黑色             if ((w->left->color == BLACK) && (w->right->color == BLACK)) {                 // 兄弟节点变成红色                 w->color = RED;                 // 轴心结点变为父节点                 x = x->parent;             } else {                 // 情况3:x的兄弟结点是黑色的,兄弟的左孩子是黑色,右孩子是红色                 if (w->left->color == BLACK) {                     //将右孩子变黑                     w->right->color = BLACK;                     //将兄弟节点变红                     w->color = RED;                     //对兄弟结点左旋                     rbtree_left_rotate(T, w);                     //将兄弟结点调整为父节点的左子树                     w = x->parent->left;                 }                 // 情况4:x的兄弟结点是黑色的,兄弟的左孩子是红色,右孩子是黑色                 // 将兄弟节点换成父节点的颜色                 w->color = x->parent->color;                 // 把父节点和兄弟节点的左孩子变黑                 x->parent->color = BLACK;                 w->left->color = BLACK;                 // 对父节点做右旋                 rbtree_right_rotate(T, x->parent);                 //将轴心结点调整为根结点                 x = T->root;             }         }     }     // 继承节点变为黑色,为了弥补失去的黑高     x->color = BLACK; }红黑树的遍历、查询、测试rbtree_node *rbtree_search(rbtree *T, KEY_TYPE key) {     rbtree_node *node = T->root;     while (node != T->nil) {         if (key < node->key) {             node = node->left;         } else if (key > node->key) {             node = node->right;         } else {             return node;         }     }     return T->nil; }   void rbtree_traversal(rbtree *T, rbtree_node *node) {     if (node != T->nil) {         rbtree_traversal(T, node->left);         printf("key:%d, color:%d ", node->key, node->color);         rbtree_traversal(T, node->right);     } }   int main() {     int keyArray[20] = {24, 25, 13, 35, 23, 26, 67, 47, 38, 98, 20, 19, 17, 49, 12, 21, 9, 18, 14, 15};      rbtree *T = (rbtree *) malloc(sizeof(rbtree));     if (T == NULL) {         printf("malloc failed ");         return -1;     }      T->nil = (rbtree_node *) malloc(sizeof(rbtree_node));     T->nil->color = BLACK;     T->root = T->nil;      rbtree_node *node = T->nil;     int i = 0;     for (i = 0; i < 20; i++) {         node = (rbtree_node *) malloc(sizeof(rbtree_node));         node->key = keyArray[i];         node->value = NULL;         rbtree_insert(T, node);      }     rbtree_traversal(T, T->root);     printf("---------------------------------------- ");      for (i = 0; i < 20; i++) {         rbtree_node *node = rbtree_search(T, keyArray[i]);         rbtree_node *cur = rbtree_delete(T, node);         free(cur);         rbtree_traversal(T, T->root);         printf("---------------------------------------- ");     } }
  原文链接:随处可见的红黑树详解_cheems~的博客-CSDN博客

地球的磁场强度正在下降,可能会危害到我们所生活的环境在众多末日灾难影片中,我们经常听到一个词语,叫做地球磁场,它是一种分布在地球周围空间的磁场,它并不是永恒存在的,并且很容易受到外来因素影响。对于地球上的生物来说,磁场的存在,关系到每晚临睡前3个行为,可能会影响心血管健康,建议多做3个腿部动作现在很多人都害怕自己得心脑血管疾病,尤其是中老年人,年纪越来越大,身体各个器官会衰退,会老化,其中就包括血管。如果血管老化了,血管张力会松弛,血管弹性会变差,血液的运行速度也会受阻宝宝身上拎不清的各种冬季皮肤问题,一次说清楚刚刚立冬气温骤降,一年中最冷的季节来了!天干物燥,这是对孩子非常不友好的季节,不仅要注意呼吸道疾病,还要小心呵护宝宝的肌肤。护理不到位,很容易出现皲裂脱皮倒刺苹果脸等等问题,湿疹在发挥第三支柱养老保险作用银保监会拟出台个人养老金配套政策来源人民网原创稿人民网北京11月11日电(记者杜燕飞)日前,银保监会就商业银行和理财公司个人养老金业务管理暂行办法(征求意见稿)(以下简称暂行办法)公开征求意见。暂行办法明确个人养48款手机用机成本对比苹果与部分安卓旗舰相当三星手机成跳水王按双十一,你想好买哪款新手机了吗?近年来,购物节优惠大促层出不穷,加上直播带货和各式补贴,消费者更换手机的频率明显加快。更多的二手手机流入市场,使得转转爱回收京东拍拍等回收平台应运终止内燃机研发制造发布纯电SUV沃尔沃加快全面电动化转型21世纪经济报道记者杜巧梅报道当地时间11月9日,沃尔沃旗下纯电旗舰SUVEX90在瑞典首都斯德哥尔摩正式发布。新车预计在2023年秋季海外开启预订,随后于2024年开启交付。据介庆祝煲一世和传贝达成三年1000家高速服务区门店拓展的战略规划上周,杭州厨神餐饮管理有限公司董事长陈焕庆先生和传贝科技CEO朱芳义先生在嘉兴乌镇传贝公司进行了商务洽谈。双方就拓展高速服务区门店合作交流传贝智慧高速服务区的产业互联网专家传贝科技小米抖音官方直播间重新上架销售小米10和小米10至尊纪念版IT之家11月11日消息,今日午间,有IT之家网友发现小米抖音官方直播间重新上架销售小米10和小米10至尊纪念版。直播间商品链接显示小米10标准版2299元起(2020年上市起售价猪价强势上涨未改CPI的总体回落10月猪肉价格强势上涨,但我国CPI同比读数仍回落至2。1(前值为2。8)。疫情扰动短期经济和就业压力等因素制约了核心CPI的修复速度,核心CPI的同比读数仍在0。6的低位徘徊。预供销社回归,到底发生了什么,又是为了什么?最近,供销社这个词出现的频率非常高,在资本市场上只要和供销社概念搭边,那便是一场资本的狂欢。到底发生了什么,可以让逐渐消失在人海里的供销社重回大众视野?一则消息引爆供销社近段时间,截至24点,2022双11最新战报来临,数字竞赛时代结束11月12日零点,第14届双11收官。天猫表示,今年天猫双11稳中向好,交易规模与去年持平。京东表示,截至11月11日晚2359,2022年京东11。11全球热爱季超越行业增速,创
军大衣发明百余年,曾深受我国百姓喜爱,为何07年时被我军淘汰?战场中的军大衣俗话说流行是一个圈,或许在上个流行圈倍受冷落的时尚单品,没准儿到了下一个流行圈时它又会火起来。军大衣正是如此,经历了几个流行圈的一件衣物,从战时到解放后,最终下放至民刘蓓曾被冯小刚力捧,3婚再嫁第一任丈夫,又当张若昀后妈说到刘蓓,可能90后都不会有太多印象,她是最早的冯女郎,是冯小刚捧红的女演员之一,甲方乙方让她的人气即使是现在也令人咋舌,只不过她后来从台前走向幕后,做起了老板罢了。事业上,刘蓓是深扒周星驰与冯小刚8年恩怨他们的故事远不止一次失约那么简单还有谁!2004年12月23日,周星驰导演的功夫终于上映了。买票进场的粉丝们发现,功夫开场后第一个角色并不是周星驰,反而是内地观众最熟悉的导演冯小刚。黑皮鞋,大礼帽,步步生风目空四冯小刚遭人陷害,蔡国庆立过3次三等功,军旅男星为何如此优秀?文传奇猩探编辑传奇猩探娱乐圈是个大染缸,也是个名利场。能够做到名利双收的,才是真正的赢家。细数中国百亿影帝排行榜,排名前五的百亿影帝,有三个都是军旅出身。不仅如此,军旅出身的明星确火箭态度坚决,要求76人提供选秀权,休城对侧翼工兵兴趣不大今年夏天费城76人在到处招兵买马,其中包括德安东尼梅尔顿PJ塔克丹尼尔豪斯和特莱凡林奎因在内的多名球员,都曾在火箭效力过。考虑到76人现在的总经理,曾经在火箭工作过,自然就显得不足邓超冯小刚的十一年,因为孙俪两人闹掰,过得可真累邓超冯小刚的十一年,因为孙俪两人闹掰,过得可真累,说起冯小刚和邓超的恩怨,还要追溯到2007年,当时邓超出演了冯小刚指导的电影集结号,邓超在影片中饰演男二号,在参加电影新闻发布会的花生是糖尿病的导火索吗?想要胰岛健康,该如何做?提起糖尿病大家都不陌生,前几天在网络上看到这样一则报道,上面说花生是糖尿病的导火索还是癌症的催化剂,自己就很疑问,这样的文章有没有科学依据?有些人在喝酒的时候,经常会配着花生米,但黄晓明妈妈好美啊!和大佬爸爸挽手现身,妈妈穿紫裙年轻像50岁明星们的父母原来这么有气质,黄晓明的爸爸妈妈挽手现身活动现场,礼裙与西装套装的搭配让两人看上去豪门阔气感满满,选择的穿搭造型好显气质,没想到已经70的两位凭借穿搭惊艳全场,黄晓明的表面是星二代,实际是可怜人,有亲爹像没有,最长38年没见过爸爸潘粤明,大概是全网最卑微的明星爸爸吧。7月19日,董洁带着儿子顶顶参加活动,13岁的顶顶身穿浅色短袖上衣搭配牛仔短裤,留着一头清爽短发,眉清目秀,唇红齿白,可谓完美继承了父母的优秀三伏天孩子没胃口,多吃这6道菜,开胃又下饭,保证孩子食欲大开三伏天天气热,孩子吃饭没有胃口,食欲不振,多给小孩吃这5道开胃下饭菜,好吃又下饭,做法简单营养美味,孩子都爱吃!可乐鸡翅食材鸡翅生姜香葱可乐白芝麻1首先准备适量的鸡翅清洗一下。控干八成的人都没见过的照片,长见识,带你看中国最顶级的国宾馆!提到钓鱼台国宾馆很多人想到高级神秘作为中国最顶级的宾馆至今已接待1300余位外国元首和政府首脑不仅是超星级宾馆更是一处受到世界各国和媒体密切关注的地方钓鱼台国宾馆1958年建于古钓