反序列化(先序)——split : string-->vector<string>

本文介绍了一种将字符串反序列化为二叉树的方法,包括字符串分割、队列存储及递归构建二叉树的过程。

反序列化:将string生成二叉树

先序反序列化操作具体步骤:
(1)先将string字符串进行分割,生成多个string构成的集合保存在vector<string>中;
(2)将vec<string>中的每一个元素存入到queue<string>中
[说明]此时已经将string转换成为能够序列化的queue<string>队列。
/*****************************************************/3)对queue<string>队列进行序列化操作
A.参数——queue<string>&,返回值TreeNode*
B.
    获取队头结点存给变量value,并将队头结点出队列
    判断value是否等于NULL(即:value == "#")
        ①若等于,返回空;
        ②若不等,则new出T结点,并赋值T->str = value;
            再递归创建左子树:T->lchild = recon(Q);
            再递归创建右子树:T->rchild = recon(Q);
            最后返回T

=====================================================





#include <vector>
#include <string>
#include <iostream>
#include <queue>
using namespace std;

typedef struct TreeNode
{
    string data;
    struct TreeNode* lchild;
    struct TreeNode* rchild;
}TreeNode;


vector<string> split(const string &s, const string &seperator)  //相当于java中的split函数
{ //返回值是string类型的容器vector<string>

    vector<string> result;
    typedef string::size_type string_size;
    string_size i = 0;

    while (i != s.size()){
        //找到字符串中首个不等于分隔符的字母;
        int flag = 0;
        while (i != s.size() && flag == 0){
            flag = 1;
            for (string_size x = 0; x < seperator.size(); ++x)
                if (s[i] == seperator[x]){
                    ++i;
                    flag = 0;
                    break;
                }
        }

        //找到又一个分隔符,将两个分隔符之间的字符串取出;
        flag = 0;
        string_size j = i;
        while (j != s.size() && flag == 0){
            for (string_size x = 0; x < seperator.size(); ++x)
                if (s[j] == seperator[x]){
                    flag = 1;
                    break;
                }
            if (flag == 0)
                ++j;
        }
        if (i != j){
            result.push_back(s.substr(i, j - i));
            i = j;
        }
    }
    return result;
}

void pretravel(TreeNode* T)  //先序遍历
{
    if (T != NULL)
    {
        cout << T->data << " ";
        pretravel(T->lchild);
        pretravel(T->rchild);
    }
}

TreeNode* Deserialize1(queue<string>& Q) //反序列化操作
{
    string value = Q.front(); //获取队头元素值,并出队
    Q.pop();

    if (value == "#") //NULL
    {
        return NULL;
    }

    TreeNode* T = new TreeNode;  //创建根节点T
    T->data = value;
    T->lchild = Deserialize1(Q); //递归创建左子树
    T->rchild = Deserialize1(Q); //递归创建右子树

    return T;
}

int index = -1;  //定义全局变量

TreeNode* Deserialize2(vector<string>& Arr) 
{
    index++; //依次遍历vector<string>中的每一个元素

    if (index >= Arr.size() || Arr[index] == "#")
    {
        return NULL;
    }

    TreeNode* T = new TreeNode;
    T->data = Arr[index];
    T->lchild = Deserialize2(Arr);
    T->rchild = Deserialize2(Arr);
    return T;
}
int main()
{
    string s = "30,10,50,#,#,#,20,45,#,#,35,#,#";
    vector<string> Arr = split(s, ","); //可按多个字符来分隔

    queue<string> Q;

    for (int i = 0; i < Arr.size(); i++)  //将vec<string>每一个元素存入到queue<string>队列中
        Q.push(Arr[i]);

    TreeNode* head1 = Deserialize1(Q); //反序列化
    pretravel(head1); //先序遍历

    cout << endl;

    TreeNode* head2 = Deserialize2(Arr); //反序列化
    pretravel(head2); //先序遍历

    return 0;
}

剑指offer(64):序列化二叉树http://blog.youkuaiyun.com/u011080472/article/details/51290794

已知 typedef std::shared_ptr<BevMapInfo> BevMapInfoPtr; struct BevMapInfo { cem::message::common::Header header; int32_t frame_id = 0; uint16_t lanemarkers_num = 0; uint16_t edge_num = 0; bool is_local_pose = false; bool is_on_highway = false; MapType map_type = MapType::UNKOWN_MAP; RoadClass road_class = RoadClass::UNKNOWN; std::vector<BevLaneMarker> lanemarkers = {}; // lane std::vector<BevLaneMarker> edges = {}; std::vector<BevLaneInfo> lane_infos = {}; // lane center std::vector<BevLaneMarker> stop_lines = {}; std::vector<BevLaneMarker> crosswalks = {}; std::vector<BevLaneMarker> arrows = {}; std::vector<BevLaneMarker> junctions = {}; std::vector<BevLaneMarker> diversion_zone = {}; std::vector<CrossPoint> cross_points = {}; BevMapRouteInfo route = {}; cem::message::env_model::EnvInfo env_info; std::string debug_infos = ""; }; struct BevLaneInfo { uint64_t id = 0; uint64_t section_id = 0; uint64_t left_lane_id = 0; uint64_t right_lane_id = 0; uint64_t road_id = 0; uint64_t junction_id = 0; uint32_t left_lane_marker_id = 0; uint32_t right_lane_marker_id = 0; uint32_t number_of_points = 0; uint32_t position = 0; uint32_t connect_score = 0; double length = 0; double speed_limit = 0; // uint: m/s float width = 0.0f; float start_dx = 0; float end_dx = 0; float conf = 0.0f; std::vector<uint64_t> left_lane_boundary_ids = {}; std::vector<uint64_t> right_lane_boundary_ids = {}; std::vector<uint64_t> left_road_boundary_ids = {}; std::vector<uint64_t> right_road_boundary_ids = {}; std::vector<uint64_t> previous_lane_ids = {}; std::vector<uint64_t> next_lane_ids = {}; std::vector<uint64_t> stopline_ids = {}; std::vector<cem::message::common::Point2DF> line_points = {}; std::shared_ptr<std::vector<Eigen::Vector2f>> geos = std::make_shared<std::vector<Eigen::Vector2f>>(); BevLaneDirection direction = BevLaneDirection::DIRECTION_UNKNOWN; BevLaneType lane_type = BevLaneType::LANE_TYPE_UNKNOWN; BevArrowType arrow_type = BevArrowType::ARROW_UNKNOWN; BevTurnType plan_turn_type = BevTurnType::OTHER_UNKNOWN; BevLaneConnectType connect_type = BevLaneConnectType::NORMAL; BevLaneIntersectionType intersection_type = BevLaneIntersectionType::IS_TYPE_INVALID; BevLanePositionToCrossPoint position_to_cross_point = BevLanePositionToCrossPoint::UNKNOWN; SplitTopoExtendType split_topo_extend = SplitTopoExtendType::TOPOLOGY_SPLIT_NONE; MergeTopoExtendType merge_topo_extend = MergeTopoExtendType::TOPOLOGY_MERGE_NONE; MergeInfoExtend merge_info_extend; KDTreeUtil::IndexedGeos indexed_geos{}; bool is_horizontal_lane = false; bool is_blocked = false; bool is_flow_map = false; bool is_virtual = false; bool is_junction_lane = false; bool is_mounted = false; bool is_compensation = false; bool is_bev_topo_connected = false; BevAction navi_action = BevAction::UNKNOWN; BevTrafficLightState trafficlight_state = BevTrafficLightState::TL_COLOR_UNKNOWN; uint32_t traffic_light_num = 0; uint32_t traffic_light_obj_id{0}; uint32_t traffic_light_seq_num{0}; std::vector<uint64_t> traffic_stop_lines = {}; std::vector<uint64_t> traffic_crosswalks = {}; uint32_t stay_prev_counter{0}; byd::msg::orin::routing_map::LaneInfo::TrafficSetReason traffic_set_reason{byd::msg::orin::routing_map::LaneInfo::UNKNOWN_STATE}; bool is_default_arrow = false; bool operator<(const BevLaneInfo& other) const { if (id != other.id) { return id < other.id; } } }; enum class BevLaneType { LANE_TYPE_UNKNOWN = 0, LANE_TYPE_MAIN = 1, LANE_TYPE_SIDE = 2, LANE_TYPE_EMERGENCY = 3, LANE_TYPE_OTHER = 4, LANE_TYPE_BLOCKED = 5, LANE_TYPE_EMERGENCY_STOP = 6, LANE_TYPE_VIRTUAL_JUNCTION = 7, LANE_TYPE_HARBOR_STOP = 8 }; const std::vector<uint64_t> road_selected; std::vector<uint64_t> filtered_lanes_without_harbor; 现在要实现一个功能,在road_selected和filtered_lanes_without_harbor之间对比,找到road_selected比filtered_lanes_without_harbor多出来的元素,即找到被过滤的harbor的id,然后在GlobalBevMapOutPut中将该id的车道类型赋值为LANE_TYPE_HARBOR_STOP 。C++实现。
07-31
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值