BM38 在二叉树中找到两个节点的最近公共祖先
给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。
数据范围:树上节点数满足 1≤n≤105 1≤n≤105 , 节点值val满足区间 [0,n)
要求:时间复杂度 O(n)O(n)
注:本题保证二叉树中每个节点的val值均不相同。
思考:
需要判断
- 当前节点是否为目标节点,
- 左右子树中是否存在目标节点,
当两个节点在上述两种情况下被找到的时候,修改这个节点值。
通过搜索左右子树,完成上述两个判断的过程。
代码:
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @param o1 int整型
* @param o2 int整型
* @return int整型
*/
int d = 0;
bool pre(TreeNode* root, int o1, int o2) {
if (root==nullptr) return false;
bool r1 = root->val == o1;
bool r2 = root->val == o2;
bool rr = pre(root->right, o1, o2);
bool ll = pre(root->left, o1, o2);
if ((r1 || r2) && (rr || ll))
{
d = root->val;
return false;
}
if (rr && ll)
{
d = root->val;
return false;
}
if (r1 || r2) return true;
if (rr || ll) return true;
return false;
}
int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
// write code here
pre(root,o1,o2);
return d;
}
};
BM37 二叉搜索树的最近公共祖先
描述
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
1.对于该题的最近的公共祖先定义:对于有根树T的两个节点p、q,最近公共祖先LCA(T,p,q)表示一个节点x,满足x是p和q的祖先且x的深度尽可能大。在这里,一个节点也可以是它自己的祖先.
2.二叉搜索树是若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值
3.所有节点的值都是唯一的。
4.p、q 为不同节点且均存在于给定的二叉搜索树中。
数据范围:
3<=节点总数<=10000
0<=节点值<=10000
思考:
这道题目可以用二叉排序树左右子树优化一下的,但是题目也没限复杂度,所以copy上一道题目
代码:
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @param p int整型
* @param q int整型
* @return int整型
*/
int d = 0;
bool pre(TreeNode* root, int o1, int o2) {
if (root==nullptr) return false;
bool r1 = root->val == o1;
bool r2 = root->val == o2;
bool rr = pre(root->right, o1, o2);
bool ll = pre(root->left, o1, o2);
if ((r1 || r2) && (rr || ll))
{
d = root->val;
return false;
}
if (rr && ll)
{
d = root->val;
return false;
}
if (r1 || r2) return true;
if (rr || ll) return true;
return false;
}
int lowestCommonAncestor(TreeNode* root, int p, int q) {
// write code here
pre(root,p,q);
return d;
}
};