/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类
* @param o1 int整型
* @param o2 int整型
* @return int整型
*/
int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
if (!root) {
return -1;
}
if (root->val == o1 || root->val == o2) {
return root->val;
}
int l = lowestCommonAncestor(root->left, o1, o2);
int r = lowestCommonAncestor(root->right, o1, o2);
if (l == -1) {
return r;
}
if (r == -1) {
return l;
}
return root->val;
}
};
思路:树形结构一般都是递归。
* 因为节点值都是非负的,所以返回-1表示在这棵子树上没找到对应的值。
* 如果当前节点的值就是两者之一,则直接返回当前节点的值。
** 如果另一个值在当前节点的子节点,那么当前节点的值就是正确答案。
** 否则在后续逻辑进行处理。
* 递归对左右子节点求值。
** 左右子节点中有一个为-1,因为题目保证一定能找到,所以直接返回另一个子节点的结果。(另一个子节点是-1也没关系,说明不在当前递归分支)
** 左右子节点均不为-1,说明要找的两个数分别在左右子树中,那么它们的最近公共祖先就是当前节点。

京公网安备 11010502036488号