Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何同时传递和增加指针变量的值?_C++_Pointers_Tree_Binary Tree - Fatal编程技术网

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

C++ 如何同时传递和增加指针变量的值?,c++,pointers,tree,binary-tree,C++,Pointers,Tree,Binary Tree,很抱歉,如果问题标题不清楚,但下面是说明 我想检查二叉树中的两个节点是否是近亲。我正在调用一个函数,该函数在遍历时更新级别的值,然后比较这两个值以确定它们是否是近亲 我的算法可能不正确,但我只想弄清楚如何在函数调用中增加指针变量内的值 void findLevel(Node *node,Node *nodeToFind, int* l) { if(!node) return; if(node==nodeToFind) return; if(

很抱歉,如果问题标题不清楚,但下面是说明

我想检查二叉树中的两个节点是否是近亲。我正在调用一个函数,该函数在遍历时更新级别的值,然后比较这两个值以确定它们是否是近亲

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

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

是未定义的行为,因为您正在取消引用未初始化的指针。如果你的表亲看起来更像这样:

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)
}
问题:使用指针调用函数时增量指向值 如果不做太多的工作,你就不能做你想做的事。更糟糕的是,你想做的事不会做我认为你需要做的事

当前代码(如果已修复)将返回搜索时访问的节点数,而不是树中节点的深度

解决方案:做点别的
这只对级别进行计数,并且级别计数器按值传递,因此当函数返回时,可以通过堆栈弹出轻松回溯计数。

为什么要这样做?这是一个后期增量。通话后的增量。你考虑过使用推荐人吗?void findLevelNode*node,node*nodeToFind,int&lint*l1;后跟*l1=0;这是厄运。没有将存储分配给l1。您正在设置Crom知道将什么设置为零,而程序讨厌这样。findLevel的目标是什么?如果您试图找到给定节点在树下的距离,那么您的算法将无法工作。它可以一直向左行进,而不会发现节点在一路递增,然后开始向右行进,递增更多。啦啦啦啦。。。然后最后计算访问的节点数,而不是树中节点的深度。我认为你最好是通过值传递,这样你可以很容易地回溯。我的意思是你想要传递指针,你想要增加指针指向的值。这是两件不同的事情,你为什么要用复杂的方式去做呢?
int* l1;
int* l2;
*l1=0;
*l2=0;
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)
}
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;
}