返回指向级别排序二叉树中第n个节点的指针

时间:2014-04-30 03:39:16

标签: c++ pointers tree binary-tree nodes

假设我按顺序排列这个二叉树:

enter image description here

我想返回指向第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;或者"小于"比较,即转到右子树,左子树等等。

3 个答案:

答案 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 +树。

http://en.wikipedia.org/wiki/B%2B_tree

答案 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
}

请告诉我这是否对您有所帮助。