【剑指offer】【树】68-I.二叉搜索树的最近公共祖先
题目链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian-lcof/
利用二叉搜索树的性质,左子树都比根节点小,右子树都比根节点大;从根节点开始进行比较,
- 两个节点比根节点的值都大 最低公共祖先在左子树,下次遍历的节点是当前节点的左节点
- 两个节点比根节点的值都小 最低公共祖先在右子树上,下次遍历的节点是当前节点的右节点
在树中找到的第一个在两个输入节点值之间的节点就是最低的公共子节点
递归
时间复杂度:O(N) 其中 N 为二叉树节点数;每循环一轮排除一层,二叉搜索树的层数最小为 logN (满二叉树),最大为 N(退化为链表)。
空间复杂度: O(logN) 最差情况下,即树退化为链表时,递归深度达到树的层数 logN 。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
//判断p和q是否都比根节点小
if(p -> val < root -> val && q -> val < root -> val) return lowestCommonAncestor(root->left, p, q);
//判断p和q是否都比根节点大
if(p -> val > root -> val && q -> val > root -> val) return lowestCommonAncestor(root->right, p, q);
return root;
}
};
迭代法
时间复杂度:O(N) 其中 N 为二叉树节点数;每循环一轮排除一层,二叉搜索树的层数最小为 NlogN (满二叉树),最大为 N(退化为链表)。
空间复杂度: O(1)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(!root) return nullptr;
while(root)
{
if(p -> val < root -> val && q -> val < root -> val) root = root -> left;
else if(p -> val > root -> val && q -> val > root -> val) root = root -> right;
else break;
}
return root;
}
};
知识的价值不在于占有,而在于使用