描述:
给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。
注:本题保证二叉树中每个节点的val值均不相同。
示例1
输入:
[3,5,1,6,2,0,8,#,#,7,4],5,1
返回值:
3
(题目来自牛客网)
用C++实现如下
class Solution {
public:
/**
*
* @param root TreeNode类
* @param o1 int整型
* @param o2 int整型
* @return int整型
*/
int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
//思路1,使用递归函数来完成,最近公共祖先和o1,o2有三种关系
//1.o1,o2分别在祖先左右两侧;2.祖先是o1,o2在左右两侧;3.祖先是o2,o1在左右两侧;
//将CommmonAncestor定义成了求祖先节点的函数,使用递归函数进行求解
return CommonAncestor(root, o1, o2)->val; //输入root节点,以及o1,o2的值
}
TreeNode* CommonAncestor(TreeNode *root, int o1, int o2) //输入root节点,以及o1,o2的值
{
if (root == nullptr || root->val == o1 || root->val == o2) //根节点为空,或者情况二和三
{
return root;
}
TreeNode *left = CommonAncestor(root->left,o1,o2); // 在左侧进行求解,得出节点结果
TreeNode *right = CommonAncestor(root->right,o1,o2); // 在右侧进行求解,得出节点结果
if (left == nullptr) { // 左侧无解
return right;
}
if (right == nullptr) { // 右侧无解
return left;
}
return root; // 说明刚好在root的左右两侧
}
};
纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!