一、题目描述
给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。
示例1
[3,5,1,6,2,0,8,#,#,7,4],5,1
返回
3
二、题解
dfs深度遍历
最近公共祖先和o1,o2有三种关系:
- o1,o2分别在祖先左右两侧
- 祖先是o1,o2在祖先左/右侧
- 祖先是o2,o1在祖先左/右侧
使用dfs深度遍历,如果节点为o1,o2中其中一个直接返回,如果节点超过叶子节点也返回
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
TreeNode* CommonAncestor (TreeNode* root, int o1, int o2)
{
if (root == NULL || root->val == o1 || root->val == o2) { // 超过叶子节点,或者root为p、q中的一个直接返回
return root;
}
TreeNode* left = CommonAncestor(root->left,o1,o2); // 返回左侧的p\q节点
TreeNode* right = CommonAncestor(root->right,o1,o2); // 返回右侧的p\q节点
if (left == NULL) { // 都在右侧
return right;
}
if (right == NULL) { // 都在左侧
return left;
}
return root; // 在左右两侧
}
public:
/**
*
* @param root TreeNode类
* @param o1 int整型
* @param o2 int整型
* @return int整型
*/
int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
// write code here
return CommonAncestor(root, o1, o2)->val;
}
};