假设我按顺序排列这个二叉树:
我想返回指向第5个节点的指针。我在构建函数时遇到了麻烦。
这是我到目前为止所拥有的:
Node* GetNodeAtCount(Node *r, int x)
{
if(r != NULL)
{
if(r->count == x) {return r;}
else
{
GetNodeAtCount(r->left, x); // my problem is here
GetNodeAtCount(r->right, x);
}
}
}
我的功能只能正确返回树的右侧。我无法想出一种单独调用递归函数的方法,因为我不能通过大于"来过滤#34;或者"小于"比较,即转到右子树,左子树等等。
答案 0 :(得分:1)
我不熟悉C ++,所以这将是伪代码:
If the current node does not exists:
return failure
If (the node is the one you are after):
return the current node
result=recurse(left node)
if result != failure:
return result
return recurse(right node) // which may be failure
编辑,在开始时添加“当前节点不存在”的检查;这简化了其余的代码。我认为在C ++中你可以与null对象进行比较吗?
答案 1 :(得分:1)
如果您的树按计数排序,那么您可以从那里进行比较和分支:
else if (x < r->count && r->left != NULL) { return GetNodeAtCount(r->left, x); }
else if (x > r->count && r->right != NULL) { return GetNodeAtCount(r->right, x); }
else { return NULL; }
不要忘记检查r-&gt; left和r-&gt;右边的NULL值! 请注意这些行中的返回调用。
如果您的树没有按计数排序,那么您必须检查返回值。
else
{
Node *ret;
ret = (r->left != null ? GetNodeAtCount(r->left, x) : NULL);
ret = (ret == NULL && r->right != null ? GetNodeAtCount(r->right, x) : ret);
return ret;
}
但是,如果你在没有排序的情况下使用树,你应该重新考虑你的数据结构,并且可能使用更合适的东西。即使是矢量/数组也比搜索未排序的树更快。如果您正在使用树,因为您正在为其他字段进行排序,请考虑使用B +树。
答案 2 :(得分:1)
你需要递归调用左树,可能是这样的东西 -
Node* GetNodeAtCount(Node *r, int x)
{
if(r != NULL)
{
if(r->count == x) {return r;}
Node *temp = GetNodeAtCount(r->right, x); //check right tree for match
if (temp != NULL)
return temp;
return GetNodeAtCount(r->left, x); // if right tree does not match further go into left tree
}
return NULL //return NULL if it is the end of tree so that the check temp != NULL will work correctly
}
请告诉我这是否对您有所帮助。