给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
示例 1:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点5
和节点1
的最近公共祖先是节点3。
示例 2:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出: 5 解释: 节点5
和节点4
的最近公共祖先是节点5。
因为根据定义最近公共祖先节点可以为节点本身。
思路:
搜索每一条路径,当搜索到这个节点时,我们将这条路径保存到res1中,另一个节点的路径保存到res2中,则根据这两条路径,则可以找到他们距离最近的公共祖先。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
vector<TreeNode*> path;
vector<TreeNode*> res1;
vector<TreeNode*> res2;
int flag=0;
preorder(root,p,path,res1,flag);//寻找节点p所在路径,保存到res1
flag=0;
path.clear();
preorder(root,q,path,res2,flag);//寻找节点q所在路径,保存到res2
int len=0;
if(res1.size()<res2.size())//最短距离设为len
len=res1.size();
else
len=res2.size();
TreeNode* result=0;
for(int i=0;i<len;i++){
if(res1[i]==res2[i])//因为不知道哪条路径最短,所以依次保存,直到结束,resut肯定是最近的祖先
result=res1[i];
}
return result;
}
private:
void preorder(TreeNode *node,TreeNode *search,vector<TreeNode*> &path,vector<TreeNode*> &res,int &flag)//寻找search节点所在的路径,结果保存到res中
{
if(flag||!node)
return;
path.push_back(node);
if(node==search){
flag=1;
res=path;
}
preorder(node->left,search,path,res,flag);
preorder(node->right,search,path,res,flag);
path.pop_back();
}
};