C 我怎么能得到红黑树的高度而不是黑树的高度

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 {

我试图得到一棵红黑树的高度,这棵树插入了一个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
        {
            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;
}