【问题标题】:Searching a node with balance factor of -2 in an AVL tree在 AVL 树中搜索平衡因子为 -2 的节点
【发布时间】:2013-05-23 04:39:11
【问题描述】:

我知道如何在 AVL 树中搜索具有特定键的节点。但我想知道如何在平衡因子为 -2 的 AVL 树中进行搜索

这是我尝试过的代码。

void searchForUnrequiredBalanceFactor(avlnode *n , avlnode *r)
{
    avlnode *ptr ;
    ptr = n ;
    if (ptr==NULL)
        return;
    else
    {
        if (ptr ->balFact == -2)
        {
            r = ptr ;
            return ;
        }
        else
        {
            searchForUnrequiredBalanceFactor(ptr->left,r);
            searchForUnrequiredBalanceFactor(ptr->right,r);
        }
    }
}

但是代码没有按要求工作,这是什么问题??

输出:

balance factor of node 3 : 0 
balance factor of node 5 : 0 
balance factor of node 10 : 0 
balance factor of node 30 : 0 
balance factor of node 25 : -1 
balance factor of node 20 : -2 
balance factor of node 15 : -1 
*searchForUnrequiredBalanceFactor called and printf*
node with data : 0 have balance factor : 0

【问题讨论】:

  • 我认为您应该在问题中提供至少几条信息:您得到的实际结果是什么?您是否计算了树中节点的平衡因子?树中是否存在平衡因子为 -2 的节点?
  • 是的。我已经计算了节点的平衡因子,并且还有一个平衡因子为 -2 的节点。

标签: c data-structures avl-tree


【解决方案1】:

假设avlnode *r是一个输出参数,你想存储找到的节点,你需要改变这一行:

r = ptr ;

到这里:

*r = *ptr ;

【讨论】:

  • 通过声明*r = *ptr,您没有获得节点的确切位置,您只是获得了包含平衡因子 -2 的节点的键。那么,为什么不r = ptr
  • 使用*r = *ptr,您将整个节点从ptr 指向的地址复制到r 指向的地址。如果您执行r = ptr,那么您只会使该更改对searchForUnrequiredBalanceFactor 可见,而不是对调用函数可见(r 的范围是searchForUnrequiredBalanceFactor,而@987654333 指向的内存的“范围” @ 可能是整个程序,具体取决于您在哪里分配/释放那块内存)。
  • 好的,但是r 是通过引用调用传递的。所以当我让它指向 ptr 时,它也应该可以工作。
  • 没有。对r 所做的更改将仅对searchForUnrequiredBalanceFactor 可见。另一方面,对*r 所做的更改将在内存r 指向的任何地方可见。
  • 再次,您正在修改一个指针,该指针的生命周期在函数返回时结束。您没有修改指针指向的内存。您链接到的示例也有问题,您似乎试图返回局部变量的地址(函数返回后将不再存在)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多