【问题标题】:How to pass and increment the value of a pointer variable at the same time?如何同时传递和递增指针变量的值?
【发布时间】:2018-11-28 18:49:40
【问题描述】:

对不起,如果问题标题含糊不清,但这里是描述。

我想检查二叉树中的 2 个节点是否是表亲。我正在调用一个函数,它在遍历时更新关卡的值,然后比较这两个值以查看它们是否是表亲。

我的算法可能不正确,但我只是想弄清楚如何在函数调用中增加指针变量内的值。

void findLevel(Node *node,Node *nodeToFind, int* l)
{
    if(!node)
        return;
    if(node==nodeToFind)
        return;
    if(node->left)
        findLevel(node->left, nodeToFind, (*l)++); #line 1
    if(node->right)
        findLevel(node->right, nodeToFind, (*l)++);#line 2
    return;
    //(*l)++;                                      #line 3
}

bool ifCousin(Node *root,Node *a,Node *b)
{
    int* l1;
    int* l2;
    *l1=0;
    *l2=0;
    findLevel(root, a, l1);
    findLevel(root, b, l2);
    if(l1==l2)
        return true;
    else
        return false;
}

我在第 1 行和第 2 行遇到错误,因为类型不匹配。 我可以像第 3 行那样,但这会增加每个函数调用的值。我不想要那个。

我如何在拨打电话时提高级别?

错误信息:

prog.cpp: In function 'void findLevel(Node*, Node*, int*)':
prog.cpp:98:49: error: invalid conversion from 'int' to 'int*' [-fpermissive]
         findLevel(node->left, nodeToFind, (*l)++);
                                                 ^
prog.cpp:92:6: note:   initializing argument 3 of 'void findLevel(Node*, Node*, int*)'
 void findLevel(Node *node,Node *nodeToFind, int* l){
      ^
prog.cpp:100:50: error: invalid conversion from 'int' to 'int*' [-fpermissive]
         findLevel(node->right, nodeToFind, (*l)++);
                                                  ^
prog.cpp:92:6: note:   initializing argument 3 of 'void findLevel(Node*, Node*, int*)'
 void findLevel(Node *node,Node *nodeToFind, int* l){
      ^

【问题讨论】:

  • 为什么要打它?是后期增量。调用后递增。
  • 您考虑过使用参考吗? void findLevel(Node *node,Node *nodeToFind, int& l)
  • int* l1; 后跟 *l1=0; 这是一个厄运。没有为l1 分配存储空间。您将 Crom-knows-what 设置为零,程序讨厌这样。
  • findLevel 的目标是什么?如果您试图找出给定节点在树的下方有多远,您的算法将不起作用。它可以一直向左行进,而没有发现节点一直在增加,然后开始向右行进,增加更多。啦啦啦...然后最后吐出访问的节点数,而不是树中节点的深度。我认为你最好通过价值传递,这样你就可以轻松地回溯。
  • 我的意思是你想传递指针并且你想增加指针指向的值。那是两件不同的事情,你为什么要这么复杂?

标签: c++ pointers tree binary-tree


【解决方案1】:

问题:使用指针调用函数时增加指向的值

如果不做太多的工作,你就无法做你想做的事。更糟糕的是,你想做的事不会做我认为你需要做的事。

如果固定,当前代码将返回搜索时访问的节点数,而不是树中节点的深度。

解决方案:做其他事情

int findLevel(Node *node, Node *nodeToFind, int level) // not a pointer
{
    if (!node) // probably redundant You test for NULL before recursing.
               // Add test for NULL before entering and you're done
        return 0; // can't find anything here
    level++; // save a few increments by doing it once here
    if (node == nodeToFind)
        return level; // found it. Return level

    int foundat = 0;
    if (node->left) // check left
        foundat = findLevel(node->left, nodeToFind, level);
    if (foundat == 0 && node->right) // if we need to, check right
        foundat = findLevel(node->right, nodeToFind, level);
    return foundat;
}

这仅计算级别,并且级别计数器按值传递,因此当函数返回时,堆栈弹出很容易回溯计数。

【讨论】:

    【解决方案2】:

    (*l)++ 取消对指针的引用,然后递增被指向的值。那是你真正想要的吗?如果是这样,那么您需要在每次递归调用findLevel() 时按原样传递l,而不在同一语句中增加它1

    void findLevel(Node *node, Node *nodeToFind, int* l)
    {
        if (!node)
            return;
        if (node == nodeToFind)
            return;
        if (node->left)
        {
            (*l)++; // <-- here
            findLevel(node->left, nodeToFind, l);
        }
        if (node->right)
        {
            (*l)++; // <-- here
            findLevel(node->right, nodeToFind, l);
        }
        return;
    }
    

    1:虽然我确定这个算法是错误的,正如 @user4581301 在 cmets 中解释的那样,但我不确定修复它的正确方法。

    顺便说一句,这段代码:

    int* l1;
    int* l2;
    *l1=0;
    *l2=0;
    

    未定义的行为,因为您正在取消引用未初始化的指针。 ifCousin() 应该看起来更像这样:

    bool ifCousin(Node *root, Node *a, Node *b)
    {
        int l1 = 0;
        int l2 = 0;
        findLevel(root, a, &l1);
        findLevel(root, b, &l2);
        return (l1 == l2)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-08
      • 2017-07-23
      • 2016-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      相关资源
      最近更新 更多