在一颗二叉树中找出两个节点的第一个共同祖先

后序遍历

基本思想:如果这两个节点不在一条线上(即这两个节点不存在一个节点是另一个节点的祖先的情况),则它们必定分别在所求节点A的左子树和右子树上,后序遍历到第一个满足这个条件的节点就是所要求的节点A。否则,当这两个节点在一条线上,所求节点A则是这两个节点中深度最低的节点的父节点。

bool lca(Node *root, int va, int vb, Node *&result, Node* parent)
{
    // left/right 左/右子树是否含有要判断的两节点之一 
    bool left = false, right = false;
    if (!result && root->left) left = lca(root->left,va,vb,result,root);
    if (!result && root->right) right = lca(root->right,va,vb,result,root);

    // mid 当前节点是否是要判断的两节点之一 
    bool mid = false;
    if (root->data == va || root->data == vb) mid=true;
    if (!result && int(left + right + mid) == 2) {
        if (mid) result = parent;
        else result = root;
    }
    return left | mid | right ;
}

Node *query(Node *root,int va, int vb)
{
    if (root == NULL) return NULL;
    Node *result = NULL;
    lca(root, va, vb,result, NULL);
    return result;
}

 

posted @ 2016-07-27 17:36  程序猿进化之路  阅读(440)  评论(0)    收藏  举报