二叉樹的最近公共祖先


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

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

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

迭代:

TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        
        while(root){
            if(root==p||root==q||root==NULL)return root;
            else if((root->val>p->val&&root->val<q->val)||(root->val<p->val&&root->val>q->val))return root;
            else if(root->val<p->val&&root->val<q->val)root=root->right;
            else
                root=root->left;
        }
        
        return NULL;
    }

2.若是一棵普通二叉樹

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

TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==NULL)return NULL;
        if(root==p||root==q)return root;
        TreeNode* left=lowestCommonAncestor(root->left,p,q);
        TreeNode* right=lowestCommonAncestor(root->right,p,q);
        if(left!=NULL&&right!=NULL)return root;
        else if(left!=NULL)return left;
        else if(right!=NULL)return right;
        else
            return NULL;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM