题目描述
给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。
示例1
输入
[3,5,1,6,2,0,8,#,#,7,4],5,1
返回值
3
解法
// 解法: 递归(后序遍历框架)
// 终止条件:1. 越过叶节点,直接返回null; 2. root == o1 || root == o2, 返回 root.
// 递归: 分别获得左右子树上的最近公共祖先节点.
// left=lowestCommonAncestor(root->left, o1, o2)
// right=lowestCommonAncestor(root->right, o1, o2)
// 返回结果:根据左右子树结果,判断最终返回结果。
// 1. left == null && right == null, return null // o1, o2 不在root的两子树上
// 2. left == null && right != null, return right // o1, o2 在root 右子树
// 3. left != null && right == null, retut left // o1, o2 在root 左子树
// 4. left != null && right != null, return root // o1, o2 分别root的两子树上
// 时间O(N), 空间O(N)
int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
if (root == nullptr) return INT_MIN;
if (root->val == o1 || root->val == o2) return root->val;
int left = lowestCommonAncestor(root->left, o1, o2);
int right = lowestCommonAncestor(root->right, o1, o2);
if (left == INT_MIN ) return right;
if (right == INT_MIN) return left;
return root->val;
}


京公网安备 11010502036488号