236. 二叉树的最近公共祖先

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

百度百科中最近公共祖先的定义为:“对于有根树 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。因为根据定义最近公共祖先节点可以为节点本身。

/**

 * 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:

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {

        vector<TreeNode*> path;

        vector<TreeNode*> node_p_path;

        vector<TreeNode*> node_q_path;

        int finish = 0;

        preorder(path,node_p_path,root,p,finish);

        path.clear();

        finish = 0;

        preorder(path,node_q_path,root,q,finish);

        int path_len = 0;

        if(node_p_path.size() < node_q_path.size())

        {

            path_len = node_p_path.size();

        }

        else

            path_len = node_q_path.size();

        TreeNode* res = 0;

        for(int i = 0;i < path_len;i++)

        {

            if(node_p_path[i] == node_q_path[i])

                res = node_p_path[i];

        }

        return res;

    }

    void preorder(vector<TreeNode*>& path,vector<TreeNode*>& res,TreeNode* node,TreeNode* search,int& finish)

    {

        if(!node || finish)

        {

            return;

        }

        path.push_back(node);

        if(node == search)

        {

            finish = 1;

            res=path;

        }

        preorder(path,res,node->left,search,finish);

        preorder(path,res,node->right,search,finish);

        path.pop_back();

    }

};

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容