zoukankan      html  css  js  c++  java
  • [LeetCode] Lowest Common Ancestor of a Binary Tree

    Lowest Common Ancestor of a Binary Tree

    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.

    方法一:根据路径找LCA。

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     void getPath(TreeNode *root, TreeNode *p, TreeNode *q, vector<TreeNode*> &path, vector<TreeNode *> &path1, vector<TreeNode*> &path2) {
    13         if (root == NULL) return;
    14         path.push_back(root);
    15         if (root == p) path1 = path;
    16         if (root == q) path2 = path;
    17         //找到两个节点后就可以退出了
    18         if (!path1.empty() && !path2.empty()) return;
    19         getPath(root->left, p, q, path, path1, path2);
    20         getPath(root->right, p, q, path, path1, path2);
    21         path.pop_back();
    22     }
    23     
    24     TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
    25         vector<TreeNode*> path, path1, path2;
    26         getPath(root, p, q, path, path1, path2);
    27         TreeNode *res = root;
    28         int idx = 0;
    29         while (idx < path1.size() && idx < path2.size()) {
    30             if (path1[idx] != path2[idx]) break;
    31             else res = path1[idx++];
    32         }
    33         return res;
    34     }
    35 };

    方法二:节点a与节点b的公共祖先c一定满足:a与b分别出现在c的左右子树上(如果a或者b本身不是祖先的话)。

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
    13         if (root == NULL) return NULL;
    14         if (root == p || root == q) return root;
    15         TreeNode *L = lowestCommonAncestor(root->left, p, q);
    16         TreeNode *R = lowestCommonAncestor(root->right, p, q);
    17         if (L && R) return root;
    18         return L ? L : R;
    19     }
    20 };
  • 相关阅读:
    PATA 1071 Speech Patterns.
    PATA 1027 Colors In Mars
    PATB 1038. 统计同成绩学生(20)
    1036. 跟奥巴马一起编程(15)
    PATA 1036. Boys vs Girls (25)
    PATA 1006. Sign In and Sign Out (25)
    读取web工程目录之外的图片并显示
    DOS命令
    java连接oracle集群
    servlet
  • 原文地址:https://www.cnblogs.com/easonliu/p/4643873.html
Copyright © 2011-2022 走看看