leecode第二百三十六题(二叉树的最近公共祖先)

/**
 * 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:
    void serch_patch(TreeNode* root, TreeNode* node,vector<TreeNode*> &path,bool &is_search)
    {
        path.push_back(root);
        if(root->val==node->val)//要是找到路径了
        {
            is_search=true;//标志修改,然后返回
            return;
        }
        
        if(root->left!=NULL)
            serch_patch(root->left,node,path,is_search);
        if(is_search)//在左边找到了,就不用在右面找了
            return;
        
        if(root->right!=NULL)
            serch_patch(root->right,node,path,is_search);
        if(is_search)//在右面找到了,就不用删除根节点了
            return;
        path.pop_back(); 
    }
    
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        bool is_flag=false;
        vector<TreeNode*> path_p;
        serch_patch(root,p,path_p,is_flag);//寻找root到p的路径
        is_flag=false;
        vector<TreeNode*> path_q;
        serch_patch(root,q,path_q,is_flag);//寻找root到q的路径
        
        int len=min(path_p.size(),path_q.size());
        TreeNode* res=root;
        for(int i=0;i<len;i++)//比较当前路径,若在最小长度下找到一致的就记住,即便一致都相等,也可以用最后一个
        {
            if(path_p[i]==path_q[i])
                res=path_p[i];
        }
        return res;//找不到就返回root,无所谓的
    }
};

分析:

一不是二叉搜索树,二没有父节点信息,只想到用路径去判断了。

posted @ 2019-04-17 15:39  深夜十二点三十三  阅读(122)  评论(0编辑  收藏  举报