题目:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
题解:
首先DFS找到到p,q节点的路径并记录下来,然后比较两条路径,得到LCA
/**
* 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:
vector<TreeNode*> ansp,ansq,temp;
void dfs(TreeNode* root,TreeNode* p,TreeNode* q)
{
if(root==NULL) return ;
if(root==p)
{
temp.push_back(root);
ansp=temp;
//因为要全部DFS一遍,在这里压入的节点要抛出下,否则下面会重复压入
temp.pop_back();
}
if(root==q)
{
temp.push_back(root);
ansq=temp;
//同理
temp.pop_back();
}
temp.emplace_back(root);
dfs(root->left,p,q);
dfs(root->right,p,q);
temp.pop_back();
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
dfs(root,p,q);
// for(int i=0;i<ansp.size();i++) printf("%d ",ansp[i]->val);
// printf("\n");
// for(int i=0;i<ansq.size();i++) printf("%d ",ansq[i]->val);
int i;
for(i=0;i<min(ansp.size(),ansq.size());i++)
{
if(ansp[i]!=ansq[i]) break;
}
return ansp[i-1];
}
};