• Lowest Common Ancestor of a Binary Search Tree & a Binary Tree


    235. Lowest Common Ancestor of a Binary Search Tree

    题目链接:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/#/description

    题目大意:给定一棵二叉查找树和两个节点p和q,要求返回这两个节点的第一个公共祖先。

    思路:对于当前节点node,如果p和q的val都大于node的val,则说明p和q的第一个公共祖先在node的右子树,如果p和q的val都小于node的val,则说明p和q的第一个公共祖先在node的左子树,否则node就是p和q的第一个公共祖先。

    算法步骤:(1)如果root->val > max(p->val, q->val),令root = root->left,调回步骤(1),否则,如果root->val < min(p->val, q->val),令root = root->right,调回步骤(1),否则返回root。

    算法复杂度:时间复杂度为O(log(n)),空间复杂度为O(1)

    代码:

     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         while (true) {
    14             if (root->val > max(p->val, q->val))
    15                 root = root->left;
    16             else if (root->val < min(p->val, q->val))
    17                 root = root->right;
    18             else
    19                 return root;
    20         }
    21     }
    22 };

    评测系统上运行结果:

    236. Lowest Common Ancestor of a Binary Tree

    题目链接:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/#/description

    题目大意:给定一棵二叉树和两个节点p和q,要求返回这两个节点的第一个公共祖先。

    思路:如果p和q都在某节点的左边,就到左子树中查找共同祖先。若都在右边,则在右子树中查找共同祖先。如果p和q不在同一边,那就表示已经找到第一个共同祖先。

    复杂度分析:时间复杂度为O(n),空间复杂度为O(n)

    代码:

     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 || root == p || root == q)
    14             return root;
    15         auto left = lowestCommonAncestor(root->left, p, q);
    16         auto right = lowestCommonAncestor(root->right, p, q);
    17         if (left && right)
    18             return root;
    19         return left ? left : right;
    20     }
    21 };

    评测系统上运行结果:

  • 相关阅读:
    UITabBarController生命周期(使用storyoard搭建)
    ios应用数据存储方式(归档)
    ios应用数据存储方式(偏好设置)
    使用picker View控件完成一个简单的选餐应用
    ios应用数据存储方式(XML属性列表-plist)
    控制器的View的创建
    控制器的创建
    权限管理具体代码实现
    gitHub相关
    初始Ajax
  • 原文地址:https://www.cnblogs.com/gxhblog/p/6660028.html
Copyright © 2020-2023  润新知