很抱歉,如果问题的标题含糊不清,那么这里是说明。
我想检查二叉树中的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){
^
答案 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;
}
这仅对级别进行计数,并且级别计数器按值传递,因此当函数返回时,可以通过堆栈弹出轻松地回溯该计数。