这个问题可能已经被很多人问过了,但是,有点不同。我们有一棵二叉树给你两个节点P&Q,我们必须找到最不常见的父节点。但是没有指向根的根节点指针。我们为您提供了两个内置功能:
1)如果节点相同,则返回true,否则返回false。
2)返回当前节点的父节点。
如果节点c实际上是根节点,那么parentNode函数将返回一个BOOL same(node *p, node *q);值。
使用这些函数,我们必须找到树的最不常见的父级。

最佳答案

假设C++:

node* leastCommonParent(node *p, node *q)
{
    node *pParent = parentNode(p);
    while(pParent != 0)
    {
        node *qParent = parentNode(q);
        while(qParent != 0)
        {
            if (0 == same(pParent, qParent))
                return pParent;
            qParent = parentNode(qParent);
        }
        pParent = parentNode(pParent);
    }
    return 0;
}

更新:下面是一个没有使用递归显式声明变量的版本我相信它可以改进,而且可能永远不会在当前形式的生产代码中使用它。
node* qParent(node *p, node *q)
{
    if (p == 0 || q == 0)
        return 0;
    if (same(p, q) == 0)
        return p;
    return qParent(p, q->parent);
}

node* pParent(node *p, node *q)
{
    return qParent(p, q) ? qParent(p, q) : pParent(p->parent, q);
}

node * result = pParent(p, q);

关于algorithm - 在二叉树中找到最不常见的父级?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13283291/

10-09 04:18