剑指——c++重建二叉树

这么简单的思想,却弄了这么久。问题在于没学过c++,没掌握c++的函数和指针
下面两篇分别使用了

迭代器来复制vector

参考:https://blog.csdn.net/sunhaobo1996/article/details/79471207

涉及:
迭代器的使用 vector::iterator

copy函数: https://blog.csdn.net/qq_43066253/article/details/88702460
先为vector分配空间,否则程序会崩
https://www.cnblogs.com/youxin/archive/2012/04/16/2452035.html

std::back_inserter https://www.cnblogs.com/zhangdongsheng/p/6432131.html
https://www.cnblogs.com/youxin/archive/2012/04/16/2452035.html
不用预先为vector分配空间

指针构建vector

参考:https://blog.csdn.net/SCS199411/article/details/91835958

指针指向需要的位置后,使用vector的assign也是可以的https://blog.csdn.net/vict_wang/article/details/88812389

涉及find(in.begin(), in.end(), value) :http://c.biancheng.net/view/7489.html

关于vector向量的坑

使用 vector指针访问vector元素时,不能简单的类似于c中数组和指针的方式。需要使用迭代器。
https://blog.csdn.net/chenwenjun1/article/details/86365959

链接2

最后附上我的各种改版:

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        int len = pre.size();
        if (len==0) return NULL;
        vector<int> pre_left,pre_right,vin_left,vin_right;
        TreeNode* head = new TreeNode(pre[0]);
        //方法一
//         int gen;
//         for(int i=0;i<vin.size();i++){
//             if(vin[i]==pre[0]) {gen=i; break;}
//         }
//         for(int i=0; i<gen; i++) {vin_left.push_back(vin[i]); pre_left.push_back(pre[i+1]);}
//         for(int i=gen+1; i<vin.size(); i++) {vin_right.push_back(vin[i]); pre_right.push_back(pre[i]);}
        
        //方法二
//         auto pos = find(vin.begin(), vin.end(), pre[0]);
//         int leftSize = pos - vin.begin();
//         int rightSize = vin.end() - pos - 1;
//         pre_left = vector<int>(pre.begin() + 1, pre.begin() + 1 + leftSize);
//         vin_left = vector<int>(vin.begin(), vin.begin() + leftSize);
//         pre_right = vector<int>(pre.begin() + 1 + leftSize, pre.end());
//         vin_right = vector<int>(vin.begin() + leftSize + 1, vin.end());
           //或者
//         pre_left.assign(pre.begin() + 1, pre.begin() + 1 + leftSize);
//         vin_left.assign(vin.begin(), vin.begin() + leftSize);
//         pre_right.assign(pre.begin() + 1 + leftSize, pre.end());
//         vin_right.assign(vin.begin() + leftSize + 1, vin.end());
        //方法三
        int gen;
        for(int i=0;i<vin.size();i++){
            if(vin[i]==pre[0]) {gen=i; break;}
        }
        vector<int>* p = &pre;
        vector<int>* q = &vin;
//         pre_left.assign(pre.begin() + 1, pre.begin() + 1 + gen);
//         vin_left.assign(vin.begin(), vin.begin() + gen);
//         pre_right.assign(pre.begin() + 1 + gen, pre.end());
//         vin_right.assign(vin.begin() + gen + 1, vin.end());
        pre_left.assign(p->begin() + 1, p->begin() + 1 + gen);
        vin_left.assign(q->begin(), q->begin() + gen);
        pre_right.assign(p->begin() + 1 + gen, p->begin() + pre.size());
        vin_right.assign(q->begin() + gen + 1, q->begin() + vin.size()); //或者q->end()

        head->left = reConstructBinaryTree(pre_left, vin_left);
        head->right = reConstructBinaryTree(pre_right, vin_right);
        return head;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值