Lintcode---最近公共祖先

給定一棵二叉樹,找到兩個節點的最近公共父節點(LCA)。node

最近公共祖先是兩個節點的公共的祖先節點且具備最大深度。web

 注意事項

假設給出的兩個節點都在樹中存在面試

樣例

對於下面這棵二叉樹this

4
 / \
3   7
   / \
  5   6

LCA(3, 5) = 4spa

LCA(5, 6) = 7code

LCA(6, 7) = 7orm

 

思路:若是兩個節點分別在根節點的左子樹和右子樹,則返回根節點。
     若是兩個節點都在左子樹,則遞歸處理左子樹,若是兩個節點都在右子樹,則遞歸處理右子樹。
          
     經典筆試題目,要熟練!
blog

 

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */
class Solution {
public:
    /**
     * @param root: The root of the binary search tree.
     * @param A and B: two nodes in a Binary.
     * @return: Return the least common ancestor(LCA) of the two nodes.
     */
    /*
    思路:若是兩個節點分別在根節點的左子樹和右子樹,則返回根節點。
          若是兩個節點都在左子樹,則遞歸處理左子樹,若是兩個節點都在右子樹,則遞歸處理右子樹。
          
          這是經典筆試題目,要熟練!
    */
    bool FindNode(TreeNode* root,TreeNode* p){
        if(root==NULL||p==NULL){
            return false;
        }
        
        if(root==p){
            return true;
        }
        
        bool found=FindNode(root->left,p);
        if(!found){
            found=FindNode(root->right,p);
        }
        
        return found;
    }
    TreeNode *lowestCommonAncestor(TreeNode *root, TreeNode *A, TreeNode *B) {
        // write your code here
        
        if(root==NULL){
            return NULL;
        }
        
        if(root==A||root==B){
            return root;
        }

        if(FindNode(root->left,A)){
            if(FindNode(root->right,B)){
                return root;
            }
            else{
                return lowestCommonAncestor(root->left,A,B);
            }
        }
        else{
            if(FindNode(root->left,B)){
                return root;
            }
            else{
                return lowestCommonAncestor(root->right,A,B);
            }
        }
        
    }
};

 

 

另外一種思路:遞歸

 

先求出從根節點到兩個節點的路徑;ci

而後比較兩條路徑,最後一個相同的節點就是他們在二叉樹中的最低公共祖先。

其實將問題轉化爲求鏈表第一個相交的節點。

相關文章
相關標籤/搜索