如何同时传递和增加指针变量的值?

时间:2018-06-19 18:13:48

标签: c++ pointers tree binary-tree

很抱歉,如果问题的标题含糊不清,那么这里是说明。

我想检查二叉树中的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){
      ^

2 个答案:

答案 0 :(得分:3)

(*l)++取消引用该指针,然后递增所指向的值。那是你真正想要的吗?如果是这样,则您需要在每次递归调用l时按原样传递findLevel(),而不必在同一语句 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在评论中解释的那样,但我不确定修复它的正确方法。

顺便说一句,这段代码:

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)
}

答案 1 :(得分: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;
}

这仅对级别进行计数,并且级别计数器按值传递,因此当函数返回时,可以通过堆栈弹出轻松地回溯该计数。