zoukankan      html  css  js  c++  java
  • LeetCode OJ:Lowest Common Ancestor of a Binary Search Tree(最浅的公共祖先)

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

    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).”

          _______6______
           /              
        ___2__          ___8__
       /              /      
       0      _4       7       9
             /  
             3   5

    For example, the lowest common ancestor (LCA) of nodes 2 and 8 is 6. Another example is LCA of nodes 2 and 4 is 2, since a

    node can be a descendant of itself according to the LCA definition.

    求最近的公共祖先,很显然,对于二叉搜索树来说,当两个节点的值都比root小的时候,lca应该在root左节点这一侧, 都比root值大的时候都在右节点这一侧,否则root

    就是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     TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
    13         if(max(p->val, q->val) < root->val)
    14             lowestCommonAncestor(root->left, p, q);
    15         else if(min(p->val, q->val) > root->val)
    16             lowestCommonAncestor(root->right,p ,q);
    17         else 
    18             return root;       
    19     }
    20 };

    而对于非二叉搜索树来说,做法一般是先分别查找到到P以及Q的路线,然后对比路线,找出LCA,代码如下:

     1 class Solution {
     2 public:
     3     TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
     4         if(root == NULL || p == NULL || q == NULL) 
     5             return NULL;
     6         vector<TreeNode *>pathP;
     7         vector<TreeNode *>pathQ;
     8         pathP.push_back(root);
     9         pathQ.push_back(root);
    10         getPath(root, p, pathP);
    11         getPath(root, q, pathQ);
    12         TreeNode * lca = NULL;
    13         for(int i = 0; i < pathP.size() && i < pathQ.size(); ++i){
    14             if(pathP[i] == pathQ[i])  //检查lca
    15                 lca = pathP[i];
    16             else break;
    17         }
    18         return lca;
    19     }
    20 
    21     bool getPath(TreeNode * root, TreeNode * target, vector<TreeNode * > & path)
    22     {
    23         if(root == target)
    24             return true;
    25         if(root->left){
    26             path.push_back(root->left);
    27             if(getPath(root->left, target, path)) return true;
    28             path.pop_back();
    29         }
    30         if(root->right){
    31             path.push_back(root->right);
    32             if(getPath(root->right, target, path)) return true;
    33             path.pop_back();
    34         }
    35         return false;
    36     }
    37 };

     java版本的如下所示:

     1 public class Solution {
     2     public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
     3         if(Math.max(p.val, q.val) < root.val){
     4             return lowestCommonAncestor(root.left, p, q);
     5         }else if(Math.min(p.val, q.val) > root.val){
     6             return lowestCommonAncestor(root.right, p, q);
     7         }else{
     8             return root;
     9         }
    10     }
    11 }
  • 相关阅读:
    在网上如何找靠谱的兼职?
    Amphorae 与 Octavia Worker 的安全通信实现
    idea遇到XXXXXXXX.java文件上出现小叉号
    2019创业做哪方面,有什么好的建议吗?
    投资理财财经 现在每个月可以抽出2000元的闲钱,投资什么项目比较好?
    开水果蔬菜超市利润大吗?
    理财能不能发家致富?
    不想打工了,手里有10万,想回农村老家创业,却不知道做什么,请各位指点迷津,谢谢?
    为什么很多人说现在做什么生意都不好做?
    ylbtech-SubwayNav(地铁线路导航)-数据库设计
  • 原文地址:https://www.cnblogs.com/-wang-cheng/p/4905291.html
Copyright © 2011-2022 走看看