二叉樹的最近公共祖先 (BSF和普通)

1.若二叉樹是一個搜索二叉樹

看這個!https://blog.csdn.net/TheWise_lzy/article/details/99610262

從樹的根節點開始和兩個節點作比較,如果當前節點的值比兩個節點的值都大,則這兩個節點的最近公共祖先節點一定在該節點的左子樹中,則下一步遍歷當前節點的左子樹;如果當前節點的值比兩個節點的值都小,則這兩個節點的最近公共祖先節點一定在該節點的右子樹中,下一步遍歷當前節點的右子樹;這樣直到找到第一個值是兩個輸入節點之間的值的節點,該節點就是兩個節點的最近公共祖先節點。

Node* lowestCommonAncestor(Node* root,int p,int q) 
{
        if(!root)return NULL;
        else if((root->val > p && root->val < q)||(root->val < p && root->val > q))
		return root;
        else if(root->val==p||root->val==q)
		return root;
        else if(root->val > p && root->val > q)
		return lowestCommonAncestor(root->l,p,q);
        else
        return lowestCommonAncestor(root->r,p,q);
}

 

2.若是一棵普通二叉樹

從根節點開始遍歷,如果node1和node2中的任一個和root匹配,那麼root就是最低公共祖先。 如果都不匹配,則分別遞歸左、右子樹,如果有一個 節點出現在左子樹,並且另一個節點出現在右子樹,則root就是最低公共祖先.  如果兩個節點都出現在左子樹,則說明最低公共祖先在左子樹中,否則在右子樹。 

Node* lowestCommonAncestor(Node* root,int p,int q) 
{
    if(root==NULL) return NULL;
    else if(root->val==p||root->val==q) return root;
    Node* left=lowestCommonAncestor(root->l,p,q);
    Node* right=lowestCommonAncestor(root->r,p,q);
    if(left!=NULL&&right!=NULL) return root;
    else if(left!=NULL) return left;
    else if(right!=NULL) return right;
    else return NULL;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章