zoukankan      html  css  js  c++  java
  • [Swift]LeetCode236. 二叉树的最近公共祖先 | Lowest Common Ancestor of a Binary Tree

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10205089.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    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 p and q as the lowest node in T that has both p and q as descendants (where we allow a node to be a descendant of itself).”

    Given the following binary tree:  root = [3,5,1,6,2,0,8,null,null,7,4]

    Example 1:

    Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
    Output: 3
    Explanation: The LCA of nodes 5 and 1 is 3.
    

    Example 2:

    Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
    Output: 5
    Explanation: The LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself according to the LCA definition.
    

    Note:

    • All of the nodes' values will be unique.
    • p and q are different and both values will exist in the binary tree.

    给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

    百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

    例如,给定如下二叉树:  root = [3,5,1,6,2,0,8,null,null,7,4]

    示例 1:

    输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
    输出: 3
    解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
    

    示例 2:

    输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
    输出: 5
    解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。
    

    说明:

    • 所有节点的值都是唯一的。
    • p、q 为不同节点且均存在于给定的二叉树中。

    递归

     1 class Solution {
     2     func lowestCommonAncestor(_ root: TreeNode?, _ p: TreeNode?,_ q: TreeNode?) -> TreeNode? {
     3         if root!.val == nil || root!.equal(p) || root!.equal(q)
     4         {
     5             return root
     6         }
     7         
     8         var left:TreeNode? = lowestCommonAncestor(root!.left, p, q)
     9         if left!.val != nil && left!.equal(p) && left!.equal(q)
    10         {
    11             return left
    12         }
    13         
    14         var right:TreeNode? = lowestCommonAncestor(root!.right, p , q)
    15         if left!.val != nil && right!.val != nil
    16         {
    17             return root
    18         }
    19         return left!.val != nil ? left : right
    20     }
    21 }
    22 public class TreeNode {
    23     public var val: Int
    24      public var left: TreeNode?
    25      public var right: TreeNode?
    26      public init(_ val: Int) {
    27         self.val = val
    28         self.left = nil
    29         self.right = nil
    30     }
    31     
    32     func equal(_ root: TreeNode?)-> Bool 
    33     {
    34         return (self.val == root!.val) && (self.left!.val == root!.left!.val) && (self.right!.val == root!.right!.val)
    35     }    
    36  }

    C++:4ms

     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 static const auto _____ = []()
    11 {
    12     ios::sync_with_stdio(false);
    13     cin.tie(nullptr);
    14     return nullptr;
    15 }();
    16 class Solution {
    17 public:
    18     TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
    19         if (root == NULL || root == p || root == q) return root;
    20         TreeNode* ptr1 = lowestCommonAncestor(root->left, p, q);
    21         TreeNode* ptr2 = lowestCommonAncestor(root->right, p, q);
    22         if (ptr1 && ptr2) return root;
    23         return ptr1 ? ptr1 : ptr2;
    24     }
    25 };

    C++:12ms

     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||p==root||q==root) return root;
    14         TreeNode *left = lowestCommonAncestor(root->left, p, q);
    15         TreeNode *right = lowestCommonAncestor(root->right, p, q);
    16         if (left && right) return root;
    17         return left ? left : right;
    18         
    19     }
    20 };
  • 相关阅读:
    屏幕取色器colorspy
    js监控按键
    修改硬件信息小工具
    C#SendKeys的用法
    错误分析:程序集未标记为可序列化
    C#xml反序列化
    office2010激活工具
    截图软件
    C#画图
    .net中SQL防注入代码
  • 原文地址:https://www.cnblogs.com/strengthen/p/10205089.html
Copyright © 2011-2022 走看看