• 7. 重建二叉树


    class Solution {
    public:
        TreeNode* f(vector<int>& pre, int pleft, int pright, vector<int>& vin, int vleft, int vright){
            if(pleft>pright) return nullptr;
            int rootVal = pre[pleft];
            TreeNode* root = new TreeNode(rootVal);
    
            vector<int>::iterator rootInVin;
            rootInVin = find(vin.begin()+vleft, vin.begin()+vright, rootVal);
            //vin l l l l rootInVin r r r
            int leftlen = rootInVin - (vin.begin()+vleft);
            //lpl: left节点的pre的left
            int lpl = pleft +1 ;
            //lpr: left节点的pre的right
            int lpr = lpl + leftlen-1;
            //注意lpr到rpl之间是+1
            int rpl = lpr + 1;
            int rpr = pright;
            int lvl = vleft;
            int lvr = lvl + leftlen -1;
            int rvl = lvr+2;
            int rvr = vright;
            root->left = f(pre, lpl, lpr, vin, lvl, lvr);
            root->right = f(pre, rpl, rpr, vin, rvl, rvr);
            return root;
        }
        TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
            return f(pre, 0, pre.size()-1, vin, 0, vin.size()-1);
        }
    };
    
    class Solution {
    public:
        TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
            //候选节点为空
            if(vin.size() == 0){
                return nullptr;
            }
            //找到pre中第一个在vin中出现的节点,就是vin中所有节点的根节点
            vector<int>::iterator rootInVin;
            for(auto& scan: pre){
                rootInVin = find(vin.begin(), vin.end(), scan);
                if(rootInVin != vin.end()){
                    break;
                }
            }
            TreeNode* root = new TreeNode(*rootInVin);
            vector<int> nextpre{pre.begin()+1, pre.end()};
            vector<int> nextleft {vin.begin(), rootInVin};
            vector<int> nextright{rootInVin+1, vin.end()};
            root->left = reConstructBinaryTree(nextpre, nextleft);
            root->right = reConstructBinaryTree(nextpre, nextright);
            return root;
        }
    };
    
  • 相关阅读:
    Discuz!如何设置板块主题分类
    Discuz X2.5 模板目录结构注释说明
    帖子标题颜色-----高亮
    discuz收听
    Discuz伪静态导致 除了首页,其他访问不了
    tag标签划过
    如何取消在线会员右边的下拉菜单,看图
    discuz邮件设置
    2017 ACM/ICPC Asia Regional Qingdao Online
    HDU 5769 Substring 后缀数组
  • 原文地址:https://www.cnblogs.com/N3ptuner/p/14588116.html
Copyright © 2020-2023  润新知