二进制搜索树代码的最低公共祖先不通过

时间:2015-12-17 10:06:51

标签: binary-tree

任何人都可以帮我这个代码吗?我无法弄清楚我被封锁的地方。

给定二叉搜索树(BST),找到BST中两个给定节点的最低共同祖先(LCA)。

TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
   TreeNode* res=NULL;
   int i=0;
   postTrav(root,p,q,res,i);
   return res;
}

void postTrav(TreeNode* root, TreeNode* p, TreeNode* q,TreeNode* res,int& i){

    if(!root){
        return;
    }
    postTrav(root->left,p,q,res,i);
    postTrav(root->right,p,q,res,i);
    if(root==p||root==q){
        i++;
    }
    if(i==2){
        res=root;
        i++;
    }
}

2 个答案:

答案 0 :(得分:0)

您没有使用BST的财产。 postTrav应该是这样的:

TreeNode* postTrav(TreeNode* root, TreeNode* p, TreeNode* q,)
{

if (root == NULL||p==NULL||q==NULL) return NULL;
int n1=p->data;
int n2=q->data;
while (root != NULL)
{
     // If both n1 and n2 are smaller than root, then LCA lies in left
    if (root->data > n1 && root->data > n2)
       root = root->left;

    // If both n1 and n2 are greater than root, then LCA lies in right
    else if (root->data < n1 && root->data < n2)
       root = root->right;

    else break;
}
return root;

}

答案 1 :(得分:0)

除此之外,您可能还有一个逻辑错误,但是,因为C [我假设]是按值调用,设置resi在本地更改为给定的函数调用,但随后丢弃了。您需要传递一些地址,如下所示。特别要注意的是,res中的TreeNode **现在是postTrav

TreeNode *
lowestCommonAncestor(TreeNode *root, TreeNode *p, TreeNode *q)
{
    TreeNode *res = NULL;
    int i = 0;

    postTrav(root, p, q, &res, &i);

    return res;
}

void
postTrav(TreeNode *root, TreeNode *p, TreeNode *q, TreeNode **res, int *i)
{

    if (!root) {
        return;
    }

    postTrav(root->left, p, q, res, i);
    postTrav(root->right, p, q, res, i);

    if (root == p || root == q) {
        *i++;
    }
    if (*i == 2) {
        *res = root;
        *i++;
    }
}

<强>更新

上面的代码很好。但是,每当我有一个函数需要返回或维护两个或多个值[并行]时,我使用的一种技术是创建一个额外的&#34;遍历&#34;或者&#34;帮助者&#34;结构,简化了传递的参数。

如果需要在调用中需要修改/维护的其他变量,而不是向所有函数添加其他参数,则只需向结构中添加另一个变量即可。当你在进行过程中建立你的逻辑时,这种方法特别有效。

这里是细化的代码。请注意,需要推送/弹出的参数较少。并且,这可能比原始执行速度快或快。另外,对我来说,trav->res似乎比*res

更清洁
// traversal "helper" struct
struct _traverse {
    TreeNode *p;                        // not modified
    TreeNode *q;                        // not modified

    TreeNode *res;                      // result
    int i;                              // depth

    // add more variables here as desired ...
#ifdef WANT_TRAVERSAL_STATISTICS
    int visited_count;                  // number of nodes we visited
#endif
};
typedef struct _traverse Traverse;

TreeNode *
lowestCommonAncestor(TreeNode *root, TreeNode *p, TreeNode *q)
{
    Traverse trav;

    trav.p = p;
    trav.q = q;

    trav.res = NULL;
    trav.i = 0;

#ifdef WANT_TRAVERSAL_STATISTICS
    trav.visited_count = 0;
#endif

    postTrav(root, &trav);

#ifdef WANT_TRAVERSAL_STATISTICS
    printf("Visited %d Nodes\n",trav.visited_count);
#endif

    return trav.res;
}

void
postTrav(TreeNode *root, Traverse *trav)
{

    if (!root) {
        return;
    }

#ifdef WANT_TRAVERSAL_STATISTICS
    trav->visited_count += 1;
#endif

    postTrav(root->left, trav);
    postTrav(root->right, trav);

    if (root == trav->p || root == trav->q) {
        trav->i++;
    }
    if (trav->i == 2) {
        trav->res = root;
        trav->i++;
    }
}