这个题考的是二叉树的遍历,节点路径的计算方式,需要回溯。
剩下的就比较简单了,就是找两个路径最后一个相同的值,就是公共祖先了。
/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ class Solution { public: /** * * @param root TreeNode类 * @param o1 int整型 * @param o2 int整型 * @return int整型 */ vector<int> path; vector<int> path1; vector<int> path2; int lowestCommonAncestor(TreeNode* root, int o1, int o2) { if(root == NULL){ return -1; } int res = root->val; // write code here findPath(root, o1,o2); for(int i=0;i<path1.size() && i < path2.size();i++){ if(path1[i] == path2[i]){ res = path1[i]; }else{ break; } } return res; } void findPath(TreeNode* root, int o1, int o2){ if(root == NULL){ return; } path.push_back(root->val); if(root->val == o1){ path1 = path; }else if(root->val == o2){ path2 = path; } if(!path1.empty() && !path2.empty()){ return; } if(root->left != NULL){ findPath(root->left, o1, o2); path.pop_back(); } if(root->right != NULL){ findPath(root->right, o1, o2); path.pop_back(); } } };