代码比较简单,主要理解思路,用dfs搜索,直到找到目标结点或者为空然后返回结果。这两个结点的位置有两种情况:在某个结点的两侧,或者一个节点在另一个结点的子树中。
情况一,能够递归地找到左右的两个结点,然后也递归地返回到最近的祖先
情况二,由于dfs的结束条件是找到某一个目标结点,而后面的子树不再找了,此时算法会继续遍历剩余的子树,肯定是找不到的,因此返回这个找到的结点就行了。
总的来说,dfs什么时候返回有意义的结点?当左右子树包含目标结点时会返回非空结点
int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
return dfs(root, o1, o2)->val;
}
TreeNode* dfs(TreeNode* root, int o1, int o2) {
if (!root || root->val == o1 || root->val == o2)return root;
TreeNode* left = dfs(root->left, o1, o2);
TreeNode* right = dfs(root->right, o1, o2);
if (!left)return right;
if (!right)return left;
return root;
}