二叉树中两个节点的最近公共祖先

思路1:我们使用DFS遍历整棵树,并且记录每一个结点,如果遍历到根也没找到目标o1,则进行删除处理(我们使用&vector对数组进行实时记录);因为需要手动删除,使用需要设置flag来标识,以免删除o1,o2;最后的路径的大小有三种情况,size1 = size2(直接取前一个数值即可),size1 < size2,size1 > szie2,大于小于这两类取长度小的最后一个数据即可

注意:此处需要用引用;我自己不想手动删除,所以就新开一个引用的数组,当找到o1或者o2时直接将路径复制到新开的数组中,然后内存超限qvq

/**

 * struct TreeNode {

 *  int val;

 *  struct TreeNode *left;

 *  struct TreeNode *right;

 * };

 */

class Solution {

public:

    void DFS(TreeNode* root, vector<int>& myvector, int o1, bool& flag)

    {

        if(root)

        {

            myvector.push_back(root->val);

            if(root->val==o1)

            {

                flag=true;

                return;

            }

            DFS(root->left, myvector, o1, flag);

            DFS(root->right, myvector, o1, flag);

            if(flag)

                return;

            myvector.pop_back();

        }

        return;

    }

    int lowestCommonAncestor(TreeNode* root, int o1, int o2) {

        vector<int> myvector1, myvector2;

        bool flag1=false;

        bool flag2=false;

        DFS(root, myvector1, o1, flag1);

        DFS(root, myvector2, o2, flag2);

        int size1=myvector1.size();

        int size2=myvector2.size();

        int len=min(size1, size2);

        for(int i=1;i<len;i++)

        {

            if(myvector1[i]!=myvector2[i])

                return myvector1[i-1];

        }

        if(size1>size2)

            return myvector2[size2-1];

        else

            return myvector1[size1-1];

    }

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值