题目链接:leetcode 236. 二叉树的最近公共祖先
题目描述:
思路解析:
1、查找:递归遍历,查找两个目标结点的路径,并且将路径存放进栈内
2、栈的裁剪:将两个栈按照小的栈进行裁剪,变成等长
3、查找公共祖先
图示:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
//前序遍历找路径
bool getPath(TreeNode*root,TreeNode*cur,stack<TreeNode*>&st)
{
if(root==nullptr)
return false;
st.push(root);
//判断当前节点是否要查找的点
if(root==cur)
return true;
//如果当前节点不是要查找的点,就查看子树
if(getPath(root->left,cur,st))
return true;
if(getPath(root->right,cur,st))
return true;
//当前节点不在查找的路径上
st.pop();
return false;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
stack<TreeNode*>path1;
stack<TreeNode*>path2;
//1.查找目标结点的路径
getPath(root,p,path1);
getPath(root,q,path2);
//2.路径裁剪
while(path1.size()!=path2.size())
{
if(path1.size()>path2.size())
path1.pop();
if(path1.size()<path2.size())
path2.pop();
}
//3.查找最近公共祖先
while(!path1.empty())
{
if(path1.top()==path2.top())
return path1.top();
else
{
path1.pop();
path2.pop();
}
}
return NULL;
}
};