1、题目描述
给定一棵二叉树和二叉树中的两个节点,找出这两个节点的公共祖先节点。例如:
给定两个节点p = 5, q = 4,那么p和q的最小的公共祖先节点为5。
2、解题思路
可以分别使用两个数组来保存从根节点到给定的两个节点的路径值,然后再从路径中找出最后一个相同的路径,即为这两个节点的最小公共祖先节点。代码如下:
vector<TreeNode*> p_array;
vector<TreeNode*> q_array;
vector<TreeNode*> temp;
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root==nullptr)
return nullptr;
find(root,p,q);
int i;
for(i = 0;i<p_array.size()&&i<q_array.size();i++){
if(p_array[i]==q_array[i])
continue;
else
break;
}
return p_array[i-1];
}
void find(TreeNode* root,TreeNode *p, TreeNode *q){
temp.push_back(root);
if(root==p){
for(int i=0;i<temp.size();i++)
p_array.push_back(temp[i]);
}
if(root==q){
for(int i=0;i<temp.size();i++)
q_array.push_back(temp[i]);
}
if(root->left)
find(root->left,p,q);
if(root->right)
find(root->right,p,q);
temp.pop_back();
}