C 我怎么能得到红黑树的高度而不是黑树的高度
我试图得到一棵红黑树的高度,这棵树插入了一个3000多字的文件,它给了我一个高度=1968我不知道是插入部分的错误还是计算高度的算法 高度函数C 我怎么能得到红黑树的高度而不是黑树的高度,c,C,我试图得到一棵红黑树的高度,这棵树插入了一个3000多字的文件,它给了我一个高度=1968我不知道是插入部分的错误还是计算高度的算法 高度函数 #define MAX(a,b) (((a)>(b))?(a):(b)) int height(Node* Root) { int h = 0; if (Root != NULL) { if (Root == T_Nil) h = 1; else {
#define MAX(a,b) (((a)>(b))?(a):(b))
int height(Node* Root)
{
int h = 0;
if (Root != NULL) {
if (Root == T_Nil)
h = 1;
else
{
int leftHeight = height(Root->left);
int rightHeight = height(Root->right);
h = MAX(leftHeight, rightHeight) + 1;
}
}
return h;
}
具有:
typedef struct Node {
char word[128];
char color;
struct Node * left;
struct Node *right;
struct Node *parent;
} Node;
struct Node T_Nil_Node;
Node * T_Nil = &T_Nil_Node;
插入函数
void redBlackInsert(Node** T, char word[128])
{
Node* z = newNode(word);
Node* y = T_Nil;
Node* x = *T;
while (x != T_Nil)
{
y = x;
if (strcmp(z->word,x->word)<0)
x = x->left;
else
x = x->right;
}
z->parent = y;
if (y == T_Nil)
*T = z;
else if (strcmp(z->word,y->word)<0)
y->left = z;
else
y->right = z;
z->left = T_Nil;
z->right = T_Nil;
z->color = RED;
redBlackInsertFixup(T, z);
}
向左旋转
void rotateLeft( Node** T, Node* x)
{
Node *y = x->right;
x->right = y->left;
if (y->left != T_Nil)
y->left->parent = x;
y->parent = x->parent;
if (x->parent == T_Nil)
*T = y;
else if (x == x->parent->left)
x->parent->left = y;
else
x->parent->right = y;
y->left = x;
x->parent = y;
}
向右旋转(我在修理时使用)
这条线看起来不对
if (Root == T_Nil)
h = 1;
我希望它看起来像这样
if (Root->right == NULL && Root->left == NULL)
h = 1;
这是一个没有子节点的节点,因此高度为1
由于函数的null值返回0,因此该函数在没有此if语句的情况下似乎可以工作。因为它在最大值之后已经有了+1,我猜这是更正确的解决方案
这条线看起来不对
if (Root == T_Nil)
h = 1;
我希望它看起来像这样
if (Root->right == NULL && Root->left == NULL)
h = 1;
这是一个没有子节点的节点,因此高度为1
由于函数的null值返回0,因此该函数在没有此if语句的情况下似乎可以工作。因为它在最大值之后已经有了+1,我猜这是更正确的解决方案
在
height
函数中,似乎将NULL和sentinel NIL节点混为一谈。要么使用NULL表示“no childern”,要么使用sentinel NIL对象。同时拥有两者似乎是错误的
此外,当到达哨兵时返回1似乎是错误的
下面是我希望代码是怎样的
使用sentinel NIL(您似乎想这么做)
使用NULL(您似乎不想这样做)
在
height
函数中,似乎将NULL和sentinel NIL节点混为一谈。要么使用NULL表示“no childern”,要么使用sentinel NIL对象。同时拥有两者似乎是错误的
此外,当到达哨兵时返回1似乎是错误的
下面是我希望代码是怎样的
使用sentinel NIL(您似乎想这么做)
使用NULL(您似乎不想这样做)
NULL
和T_Nil
之间的区别是有区别的,但除此之外,该代码看起来还可以。@codiins您需要发布更多代码-我们需要查看insert函数。不要发表评论。改为编辑问题并在问题中添加代码。tunil
应该是什么?如果它是某种避免将NULL
作为特例的哨兵,为什么它的处理方式与NULL
不同(事实上,为什么NULL
作为特例)?例如,T_Nil
和NULL
似乎都应该返回0,而在这里它们分别返回1和0。@bruno True但。。。告诉OP可能比告诉我要好:-)@bruno:这是工作中的降价,也是不将代码粘贴到注释中的另一个原因。NULL
和T_Nil
之间的区别有一个原因,但除此之外,代码看起来还可以。@codiins您需要发布更多代码-我们需要查看insert函数。不要发表评论。改为编辑问题并在问题中添加代码。tunil
应该是什么?如果它是某种避免将NULL
作为特例的哨兵,为什么它的处理方式与NULL
不同(事实上,为什么NULL
作为特例)?例如,T_Nil
和NULL
似乎都应该返回0,而在这里它们分别返回1和0。@bruno True但。。。告诉OP可能比告诉我要好:-)@bruno:这是降价,也是不将代码粘贴到注释中的另一个原因。警告:在红黑树中,所有节点都有两个子节点是其他节点或nil(nil不计算高度)@bruno--你知道nil和NULL是一样的吗?不,它们不一样,NULL是0,但T_Nil是一个特殊节点的地址(struct node T_Nil_node;node*T_Nil=&T_Nil_node;
)OP显然使用了一个T_Nil
实例作为终端叶节点(没有子节点)的信号@bruno——你说的是“哨兵节点”?在上面的if语句中——你永远不会有两种类型的“空白”叶节点。警告在红黑树中所有节点都有两个子节点是其他节点或nil(nil不计算高度)@bruno——你知道nil和NULL是一回事吗?不,它们不一样,NULL是0,但T_Nil是一个特殊节点的地址(struct node T_Nil_node;node*T_Nil=&T_Nil_node;
)OP显然使用了一个T_Nil
实例作为终端叶节点(没有子节点)的信号@bruno——你说的是“哨兵节点”?然后把它放在上面的if语句中-,你永远不会有两种类型的“空白”叶节点。它给了我相同的高度,这是错误的,我认为插入有问题,你认为呢@4386427@codiins好。。我不能对插入说太多,因为您还没有发布所有代码。例如,我们看不到redBlackInsertFixup
。我们也看不到你的MAX
在做什么。。。再说一遍。。编辑您的问题并给出我们需要的所有代码。也。。。你能用一个简短的输入文件让它失败吗?然后把那个文件也贴出来。它给了我同样的高度,这是错误的。我认为插入有问题,你认为呢@4386427@codiins好。。我不能对插入说太多,因为您还没有发布所有代码。例如,我们看不到redBlackInsertFixup
。我们也看不到你的MAX
在做什么。。。再说一遍。。编辑您的问题并给出我们需要的所有代码。也。。。你能用一个简短的输入文件让它失败吗?然后把那个文件也发出去。
int height(Node* Root)
{
assert(Root != NULL); // NULL is never allowed
if (Root == T_Nil) return 0; // No data here so return 0
int leftHeight = height(Root->left);
int rightHeight = height(Root->right);
int h = MAX(leftHeight, rightHeight) + 1;
return h;
}
int height(Node* Root)
{
if (Root == NULL) return 0; // No data here so return 0
int leftHeight = height(Root->left);
int rightHeight = height(Root->right);
int h = MAX(leftHeight, rightHeight) + 1;
return h;
}