<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      kehuadong

      紅黑樹

      #include "common.h"
      
      typedef struct rb_node_t rb_node_t;
      
      struct rb_node_t
      {
          rb_node_t *m_parent;
          rb_node_t *m_left;
          rb_node_t *m_right;
          bool m_red;
          int m_value;
      };
      
      rb_node_t *rb_node_new(rb_node_t *parent, int value)
      {
          rb_node_t *p = (rb_node_t *)calloc(1, sizeof(rb_node_t));
          p->m_parent = parent;
          p->m_red = true;
          p->m_value = value;
          return p;
      }
      
      void rotate_left(rb_node_t **root, rb_node_t *p)
      {
          rb_node_t *pp = p->m_parent;
          rb_node_t *r = p->m_right;
      
          p->m_right = r->m_left;
          r->m_left = p;
          if (pp == NULL)
          {
              *root = r;
          }
          else if (p == pp->m_left)
          {
              pp->m_left = r;
          }
          else
          {
              pp->m_right = r;
          }
      
          if (p->m_right)
          {
              p->m_right->m_parent = p;
          }
          p->m_parent = r;
          r->m_parent = pp;
      }
      
      void rotate_right(rb_node_t **root, rb_node_t *p)
      {
          rb_node_t *pp = p->m_parent;
          rb_node_t *l = p->m_left;
      
          p->m_left = l->m_right;
          l->m_right = p;
          if (pp == NULL)
          {
              *root = l;
          }
          else if (p == pp->m_left)
          {
              pp->m_left = l;
          }
          else
          {
              pp->m_right = l;
          }
      
          if (p->m_left)
          {
              p->m_left->m_parent = p;
          }
          p->m_parent = l;
          l->m_parent = pp;
      }
      
      void fix_insert(rb_node_t **root, rb_node_t *p)
      {
          while (p->m_red)
          {
              rb_node_t *pp = p->m_parent;
              rb_node_t *b = (p == pp->m_left ? pp->m_right : pp->m_left);
      
              if (b && b->m_red)
              {
                  p->m_red = false;
                  b->m_red = false;
      
                  if (pp->m_parent)
                  {
                      pp->m_red = true;
                      p = pp->m_parent;
                      continue;
                  }
              }
              else if (p == pp->m_left)
              {
                  if (p->m_right && p->m_right->m_red)
                  {
                      rotate_left(root, p);
                      p = p->m_parent;
                  }
      
                  p->m_red = false;
                  pp->m_red = true;
                  rotate_right(root, pp);
              }
              else
              {
                  if (p->m_left && p->m_left->m_red)
                  {
                      rotate_right(root, p);
                      p = p->m_parent;
                  }
      
                  p->m_red = false;
                  pp->m_red = true;
                  rotate_left(root, pp);
              }
      
              break;
          }
      }
      
      void fix_remove(rb_node_t **root, rb_node_t *p)
      {
          while (p->m_parent && p->m_red == false)
          {
              rb_node_t *pp = p->m_parent;
              if (p == pp->m_left)
              {
                  rb_node_t *b = pp->m_right;
                  if (b->m_red)
                  {
                      pp->m_red = true;
                      b->m_red = false;
                      rotate_left(root, pp);
                      b = pp->m_right;
                  }
      
                  if (b->m_left && b->m_left->m_red || b->m_right && b->m_right->m_red)
                  {
                      if (b->m_right == NULL || b->m_right->m_red == false)
                      {
                          b->m_left->m_red = false;
                          b->m_red = true;
                          rotate_right(root, b);
                          b = pp->m_right;
                      }
      
                      b->m_red = pp->m_red;
                      b->m_right->m_red = false;
                      pp->m_red = false;
                      rotate_left(root, pp);
                  }
                  else
                  {
                      b->m_red = true;
                      p = pp;
                      continue;
                  }
              }
              else
              {
                  rb_node_t *b = pp->m_left;
                  if (b->m_red)
                  {
                      pp->m_red = true;
                      b->m_red = false;
                      rotate_right(root, pp);
                      b = pp->m_left;
                  }
      
                  if (b->m_left && b->m_left->m_red || b->m_right && b->m_right->m_red)
                  {
                      if (b->m_left == NULL || b->m_left->m_red == false)
                      {
                          b->m_right->m_red = false;
                          b->m_red = true;
                          rotate_left(root, b);
                          b = pp->m_left;
                      }
      
                      b->m_red = pp->m_red;
                      b->m_left->m_red = false;
                      pp->m_red = false;
                      rotate_right(root, pp);
                  }
                  else
                  {
                      b->m_red = true;
                      p = pp;
                      continue;
                  }
              }
              break;
          }
          p->m_red = false;
      }
      
      void rb_insert(rb_node_t **root, int value)
      {
          rb_node_t *c = *root;
          rb_node_t *p = NULL;
          while (c)
          {
              p = c;
              c = (value <= c->m_value) ? c->m_left : c->m_right;
          }
      
          if (p == NULL)
          {
              *root = rb_node_new(NULL, value);
              (*root)->m_red = false;
              return;
          }
      
          if (value <= p->m_value)
          {
              p->m_left = rb_node_new(p, value);
          }
          else
          {
              p->m_right = rb_node_new(p, value);
          }
          fix_insert(root, p);
      }
      
      void rb_remove(rb_node_t **root, int value)
      {
          rb_node_t *p = *root;
          while (p && p->m_value != value)
          {
              p = (value < p->m_value) ? p->m_left : p->m_right;
          }
          if (p == NULL)
          {
              return;
          }
          if (p->m_left && p->m_right)
          {
              rb_node_t *c = p->m_right;
              while (c->m_left)
              {
                  c = c->m_left;
              }
              p->m_value = c->m_value;
              p = c;
          }
      
          rb_node_t *pp = p->m_parent;
          rb_node_t *r = (p->m_left ? p->m_left : p->m_right);
          if (r)
          {
              r->m_parent = pp;
              r->m_red = false;
              if (pp == NULL)
              {
                  *root = r;
              }
              else if (p == pp->m_left)
              {
                  pp->m_left = r;
              }
              else
              {
                  pp->m_right = r;
              }
          }
          else if (pp == NULL)
          {
              *root = NULL;
          }
          else
          {
              fix_remove(root, p);
              if (p == pp->m_left)
              {
                  pp->m_left = NULL;
              }
              else
              {
                  pp->m_right = NULL;
              }
          }
      
          free(p);
      }
      
      int rb_depth(rb_node_t *p)
      {
          if (p == NULL)
          {
              return 0;
          }
          int a = rb_depth(p->m_left);
          int b = rb_depth(p->m_right);
          return 1 + (a < b ? b : a);
      }
      
      int main()
      {
          rb_node_t *root = NULL;
      
          for (int i = 0; i < 1024 * 1024; i++)
          {
              rb_insert(&root, i);
          }
          printf("rb_depth = %d\n", rb_depth(root));
      
          for (int i = 0; i < 1024 * 1024 - 1024; i++)
          {
              rb_remove(&root, i);
          }
          printf("rb_depth = %d\n", rb_depth(root));
      
          for (int i = 0; i < 1024 * 1024 - 1024; i++)
          {
              rb_insert(&root, i);
          }
          printf("rb_depth = %d\n", rb_depth(root));
      
          for (int i = 0; i < 1024 * 1024 - 1024; i++)
          {
              rb_remove(&root, i);
          }
          printf("rb_depth = %d\n", rb_depth(root));
      }

       

      posted on 2024-09-25 13:20  kehuadong  閱讀(10)  評論(0)    收藏  舉報

      導航

      主站蜘蛛池模板: 亚洲人成网站观看在线观看| 精品蜜臀国产av一区二区| 91精品一区二区蜜桃| 屯留县| 啊轻点灬大JI巴太粗太长了在线| 精品超清无码视频在线观看| 免费视频国产在线观看| 国产亚洲中文字幕久久网| 国产一级精品在线免费看| 午夜视频免费试看| 日韩毛片在线视频x| 国精品午夜福利不卡视频| 九九九国产| 亚洲国产成人综合精品| 天堂www在线中文| 久久综合久中文字幕青草| 国产亚洲精品久久久久秋霞 | 国产成人精品永久免费视频 | 亚洲欧洲日产国码AV天堂偷窥| 错那县| 亚洲热视频这里只有精品| 强奷乱码中文字幕| 国产成人午夜福利在线播放| 国产亚洲精品久久久久秋霞 | 午夜天堂精品久久久久| 国产成人午夜精品影院| 亚洲中文字幕久久精品品| 国产裸体美女视频全黄| 深夜福利啪啪片| 国产精品美女一区二三区| 亚洲精品一区| 麻豆一区二区三区蜜桃免费| 国产精品中文字幕视频| 久久久综合香蕉尹人综合网| 人妻少妇偷人精品视频| 午夜射精日本三级| 凭祥市| 国产人妻人伦精品婷婷| 干中文字幕| 亚洲鸥美日韩精品久久| 国产无套内射又大又猛又粗又爽 |