用DFS
如果root->val
等于o1
或者o2
,就返回o1
或者o2
。
如果左右子树一个返回o1
一个返回o2
,那就返回当前节点的val,因为这就是要找的节点。
如果左右子树中有某一个返回了不是-1也不是o1
或o2
,那就说明那底下有要找的节点,直接返回他返回的值。
如果都不是就返回-1。
class Solution { public: int dfs(TreeNode* root, int o1, int o2) { int left = -1, right = -1; if(root->val == o1) return o1; if(root->val == o2) return o2; if(root->left) left = dfs(root->left, o1, o2); if(root->right) right = dfs(root->right, o1, o2); if(left == o1 && right == o2 || right == o1 && left == o2) return root->val; else if(left == o1 || right == o1) return o1; else if(left == o2 || right == o2) return o2; else return left != -1 ? left : right; } int lowestCommonAncestor(TreeNode* root, int o1, int o2) { return dfs(root, o1, o2); } };