【发布时间】: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