【LeetCode236】-二叉树的最近公共祖先

实现思路

先求出到达两个结点分别的路径,将路径存储起来
在这里插入图片描述

实现代码

在这里插入图片描述在这里插入图片描述
自己实现的代码一:(超出内存限制)

实现代码

/**
 * 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 search(TreeNode *root,TreeNode*p,TreeNode *q,vector<vector<TreeNode*>> &data,vector<TreeNode*> path){
    
    
        if(!root) return;
        path.push_back(root);

        if(root==q||root==p){
    
    
            data.push_back(path);
        }

        search(root->left,p,q,data,path);
        search(root->right,p,q,data,path);
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
    
    
        vector<vector<TreeNode*>> data;
        TreeNode *re=NULL;
        vector<TreeNode*> path;
        search(root,p,q,data,path);
        int i=0,j=0;
        int n=min(data[0].size(),data[1].size());
        for(int i=0;i<n;i++){
    
    
            if(data[0][i]==data[1][i]){
    
    
                re=data[0][i];
            }else{
    
    
                break;
            }
        }

        return re;
    }
};

自己实现的代码二:

/**
 * 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 search(TreeNode *root,TreeNode*p,TreeNode *q,vector<vector<TreeNode*>> &data,vector<TreeNode*> &path){
    
    
        if(!root) return;
        path.push_back(root);

        if(root==q||root==p){
    
    
            data.push_back(path);
        }

        search(root->left,p,q,data,path);
        search(root->right,p,q,data,path);
        path.pop_back();

    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
    
    
        vector<vector<TreeNode*>> data;
        TreeNode *re=NULL;
        vector<TreeNode*> path;
        search(root,p,q,data,path);
        int i=0,j=0;
        int n=min(data[0].size(),data[1].size());
        // cout<<"ok"<<endl;

        for(int i=0;i<n;i++){
    
    
            if(data[0][i]==data[1][i]){
    
    
                re=data[0][i];
            }else{
    
    
                break;
            }
        }

        return re;
    }
};

提交结果及分析

在这里插入图片描述
时间复杂度应该为遍历树的时间O(n)

总结

全局变量的使用
全局变量在使用的过程中,一般是多线程的时候需要使用全局变量,只是一个单线程的时候尽量避免使用全局变量
深度优先搜索代码框架
前序:没访问之前的操作
中序:正在访问时的操作
后续:访问之后的操作
引用变量的使用
在遍历路径时,最原先我在代码中传递的path是一个临时的变量,也就意味着每一次在递归的时候需要开辟新的空间,在提交的时候出现的是时间超时,后来我在执行测试的时候发现报的错误是内存超出了限制。
我将代码进行了修改,将path这一记录遍历过程中路径的参数改为了引用,也就意味着所有递归函数中使用的实际上都是一个变量的空间,由于改成了引用,所以要记得在遍历左右子树之后要最新加入的节点弹出

猜你喜欢

转载自blog.csdn.net/weixin_44944046/article/details/114298924