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 };

评测系统上运行结果:

 

posted @ 2017-05-07 18:42  小谷子的博客园  阅读(111)  评论(0编辑  收藏  举报