题目描述:
给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。
注:本题保证二叉树中每个节点的val值均不相同。
解题分析:
最近公共祖先和o1,o2有三种关系:
o1,o2分别在祖先左右两侧
祖先是o1,o2在祖先左/右侧
祖先是o2,o1在祖先左/右侧
使用dfs深度遍历,如果节点为o1,o2中其中一个直接返回
/**
* 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) {
// write code here
return haveVal(root,o1,o2)->val;
}
TreeNode* haveVal(TreeNode* root, int val1, int val2){
// 超过叶子节点,或者root为p、q中的一个直接返回
if(root==NULL || root->val==val1 || root->val==val2)
return root;
TreeNode* left=haveVal(root->left, val1, val2);// 返回左侧的p\q节点
TreeNode* right=haveVal(root->right, val1, val2);// 返回右侧的p\q节点
if(left==NULL)
return right; // 都在右侧
if(right==NULL)
return left;// 都在左侧
return root;
}
};