描述
给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。
数据范围:1 \le n \le 10001≤n≤1000,树上每个节点的val满足 0<val \le 1000<val≤100
要求:时间复杂度 O(n)O(n)
注:本题保证二叉树中每个节点的val值均不相同。
如当输入{3,5,1,6,2,0,8,#,#,7,4},5,1时,二叉树{3,5,1,6,2,0,8,#,#,7,4}如下图所示:
所以节点值为5和节点值为1的节点的最近公共祖先节点的节点值为3,所以对应的输出为3。
节点本身可以视为自己的祖先
示例1
输入:
{3,5,1,6,2,0,8,#,#,7,4},5,1
复制返回值:
3
思路:
公共节点,一定是查找的2个值分别在左右子树中返回了
如果遇到空,返回空,遇到查找的值,返回节点
/**
* 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) {
return visit(root,o1,o2)->val;
}
TreeNode* visit(TreeNode* root, int o1, int o2){
if(!root || root->val==o1 || root->val==o2) return root;
TreeNode* left = visit(root->left,o1,o2);
TreeNode* right = visit(root->right,o1,o2);
if(!left) return right; //左子树没有返回值,那一定在右子树
if(!right) return left; //右子树没有返回值,那一定在左子树
return root; //左右子树都有返回值,那公共节点就是本节点
}
};