剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
题目链接
[剑指 Offer 68 - I. 二叉搜索树的最近公共祖先]
解题思路
递归,二叉树层序遍历。
可以用 DFS ,先分别递归查找以当前节点为根节点的树中,是否存在 p->val 和 q->val 。
由于给定的是二叉搜索树,左子树的值都比 root 小,右子树都比它大。所以在搜索时可以进行判断:
if (root->val == val) {
return true;
} else if (root->val < val) {
return dfs(root->right, val);
} else { // root->val > val
return dfs(root->left, val);
}
或者和下面普通二叉树的代码一样:
return dfs(root->left, val) || dfs(root->right, val);
实现代码(C++)
class Solution {
public:
bool dfs(TreeNode *root, int val) {
if (root == NULL) {
return false;
} // root != NULL
if (root->val == val) {
return true;
} else if (root->val < val) {
return dfs(root->right, val);
} else { // root->val > val
return dfs(root->left, val);
}
// return dfs(root->left, val) || dfs(root->right, val);
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root == NULL) {
return NULL;
}
TreeNode * ans = root;
queue<TreeNode*> qq;
qq.push(root);
while (!qq.empty()) {
TreeNode *temp = qq.front(); qq.pop();
if (dfs(temp, p->val) && dfs(temp, q->val)) {
ans = temp;
}
if (temp->left != NULL) {
qq.push(temp->left);
}
if (temp->right != NULL) {
qq.push(temp->right);
}
}
return ans;
}
};
剑指 Offer 68 - II. 二叉树的最近公共祖先
题目链接
解题思路
题目问的是二叉树最近的公共祖先。
可以用 DFS ,先分别递归查找以当前节点为根节点的树中,是否存在 p->val
和 q->val
。
bool dfs(TreeNode *root, int val) {
if (root != NULL) {
if (root->val == val) {
return true;
}
return dfs(root->left, val) || dfs(root->right, val);
}
return false;
}
然后通过层序遍历,按照上面的方法,来处理整棵树。
由于层序遍历本就是按照深度(越深的在越后边)来遍历的,所以最后一个符合条件的,就是这两个节点的最近公共祖先。
实现代码(C++)
class Solution {
public:
bool dfs(TreeNode *root, int val) {
if (root != NULL) {
if (root->val == val) {
return true;
}
return dfs(root->left, val) || dfs(root->right, val);
}
return false;
}
TreeNode *process(TreeNode *root, int val1, int val2) {
TreeNode *ans, *temp;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
temp = q.front(); q.pop();
if (dfs(temp, val1) && dfs(temp, val2)) {
ans = temp;
}
if (temp->left != NULL) {
q.push(temp->left);
}
if (temp->right != NULL) {
q.push(temp->right);
}
}
return ans;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
return process(root, p->val, q->val);
}
};