【问题标题】:how to find last level of red black tree?如何找到最后一层红黑树?
【发布时间】:2015-02-24 21:44:32
【问题描述】:

我有一个简单的红黑树实现。我想打印这棵树的最后一层节点。我知道我的树有 15 个节点。所以我想要树的第 3 层。如果我为节点放置索引并找到他们如何做这项工作?或者以另一种方式存在?

typedef enum {RED, BLACK} nodecolor ;
struct node{
    node * left;
    node * right;
    node * parent;
    node * nil;
    node * root;
    int * key;
    nodecolor color;
};
node *root=NULL;
void LeftRotate(node* &tree, node* x){
    node* y;
    node* nil=tree->nil;
    y=x->right;
    x->right=y->left;
    if (y->left != nil)
    y->left->parent=x;
    y->parent=x->parent;
    if(x==x->parent->left)
        x->parent->left=y;
    else
        x->parent->right=y;
    y->left=x;
    x->parent=y;
}

void RightRotate(node* &tree, node* y){
    node* x;
    node* nil=tree->nil;
    x=y->left;
    y->left=x->right;
    if (nil != x->right)
    x->right->parent=y;
    x->parent=y->parent;
    if( y == y->parent->left)
    y->parent->left=x;
    else
    y->parent->right=x;
    x->right=y;
    y->parent=x;
}

void InsertFixUp(node * &tree, node *z){
    node *nil=tree->nil;
    node *y;
    while (z->parent->color==RED){
        if(z->parent==z->parent->parent->left){
            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;
                LeftRotate(tree,z);
            }
            z->parent->color=BLACK;
            z->parent->parent->color=RED;
            RightRotate(tree,z->parent->parent);
            }
        else{
            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;
                LeftRotate(tree,z);
            }
            z->parent->color=BLACK;
            z->parent->parent->color=RED;
            RightRotate(tree,z->parent->parent);
        }
    }
}

void Insert(node *&tree,node*&z){
    node* nil=tree->nil;
    node* root=tree->root;
    node *y;
    node *x;
    y=tree->nil;
    x=tree->root;
    while(x!=tree->nil){
        y=x;
        if((z->key)<(x->key))
            x=x->left;
        else
            x=x->right;
    }
    y=z->parent;
    if(y=tree->nil)
        z=tree->root;
    else if((z->key)<(y->key))
        z=y->left;
    else
        z=y->right;
    z->left=tree->nil;
    z->right=tree->nil;
    z->color=RED;
    InsertFixUp(tree,z);
}

【问题讨论】:

  • 请尝试改进代码格式以使其更具可读性。您也可以考虑删除代码的不相关部分(我认为修改树的函数与打印无关)。您能展示一下您当前的打印功能实现吗?
  • @kestasx:我没有写打印功能。这是我的问题。如果可能的话,我想帮助我。
  • 即使经过我的编辑,也很难阅读这段代码,请为变量使用更好的名称,像 x,y,z 这样的名称会使代码混乱。
  • 我想要一个算法来显示我的树的第 3 级。这与我的代码无关。我的意思是这个代码只是插入红黑树。

标签: tree implementation red-black-tree


【解决方案1】:

如果我正确理解了这个问题,这样的事情对你有用:

void printNode( node *n ){
   if( n->left == NULL && node->right == NULL ){
      printf( "node info: %d\n" n->key);
      return;
   }
   if( n->left != NULL )
      printNode( n->left );
   if( n->right != NULL );
      printNode( n->right );
}

请注意:它不是经过测试的代码。这个想法是使用递归函数来遍历整个树,打印关于没有后代的节点的信息(最后一级)

我使用了NULL,在您的代码中可能使用了nil(您可能需要根据自己的需要进行调整)。

【讨论】:

    猜你喜欢
    • 2011-03-21
    • 2010-09-06
    • 2015-11-17
    • 2017-09-17
    • 2011-10-08
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 2011-02-04
    相关资源
    最近更新 更多