/** * 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) { if (!root) { return -1; } if (root->val == o1 || root->val == o2) { return root->val; } int l = lowestCommonAncestor(root->left, o1, o2); int r = lowestCommonAncestor(root->right, o1, o2); if (l == -1) { return r; } if (r == -1) { return l; } return root->val; } };
思路:树形结构一般都是递归。
* 因为节点值都是非负的,所以返回-1表示在这棵子树上没找到对应的值。
* 如果当前节点的值就是两者之一,则直接返回当前节点的值。
** 如果另一个值在当前节点的子节点,那么当前节点的值就是正确答案。
** 否则在后续逻辑进行处理。
* 递归对左右子节点求值。
** 左右子节点中有一个为-1,因为题目保证一定能找到,所以直接返回另一个子节点的结果。(另一个子节点是-1也没关系,说明不在当前递归分支)
** 左右子节点均不为-1,说明要找的两个数分别在左右子树中,那么它们的最近公共祖先就是当前节点。