leetcode--Lowest Common Ancestor of a Binary Tree --C

Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.

According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”

        _______3______
       /              \
    ___5__          ___1__
   /      \        /      \
   6      _2       0       8
         /  \
         7   4

For example, the lowest common ancestor (LCA) of nodes 5 and 1 is 3. Another example is LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself according to the LCA definition.

大意:給一個二叉樹,給出樹中的兩個節點,讓你找出這兩個節點最近的公共祖先。

兩種方法,一種是分兩次遍歷樹,第一次遍歷,找到從root到P的路徑,放入一個vector或數組中。第二次遍歷找到從root到Q的路徑,放入一個vector或數組中。然後同時遍歷vector,找到他們最後一個相同的節點,則那個節點就是他們的最近公共祖先。

還有一個方法就是遞歸。因爲樹的遞歸定義,所以很多問題可以轉換爲樹的遞歸方法來做。基準情況爲root==null,或者p或者q中有一個是root,則返回null,否則p,q在不同的分支,因此分別遞歸左右節點。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
struct TreeNode* lowestCommonAncestor(struct TreeNode* root, struct TreeNode* p, struct TreeNode* q) {
    if(root == NULL || p == root || q == root)
        return root;
    struct TreeNode *left = lowestCommonAncestor(root->left,p,q);
    struct TreeNode *right = lowestCommonAncestor(root->right,p,q);
    if(left && right)
        return root;
    return (left != NULL) ? left:right;
}


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