leetcode236二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 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();
}
};

猜你喜欢

转载自blog.csdn.net/jd_457619512/article/details/88900574