bool get_node_path(TreeNode* root,TreeNode* n, vector<TreeNode*> &path){
if(root==NULL)return false;
if(root==n || get_node_path(root->left,n,path) || get_node_path(root->right,n,path)){
path.emplace_back(root);
return true;
}
return false;
}
TreeNode* get_last_common_node(vector<TreeNode*> &path1,vector<TreeNode*> &path2){
TreeNode* result;
for(int i=path1.size()-1,j=path2.size()-1;i>=0 && j>=0;--i,--j){
if(path1[i]==path2[j])result=path1[i];
else break;
}
return result;
}
TreeNode* get_last_common_parent(TreeNode* root,TreeNode* p,TreeNode* q){
if(root==NULL || p==NULL || q==NULL)return NULL;
vector<TreeNode*> path1;
get_node_path(root,p,path1);
vector<TreeNode*> path2;
get_node_path(root,q,path2);
return get_last_common_node(path1,path2);
}
参考:
1. 《剑指offer》- 7.2案例二