C++生成二叉树VS调试示例 leetcode.297(二叉树的序列化和反序列化)

在写LeetCode题时,有时候会遇到一些问题,想要逐步了解一下输出结果。
这个时候就要在VS里面进行调试了。
这里主要记录的是在VS里生成一个二叉树。然后就可以进行相应的调试了

1.序列化
就是把一棵树按照从上往下,从左往右的顺序变成一个字符串

string serialize(TreeNode* root) {
        if(root==NULL)return "";
        string res;
        res.push_back('[');
        queue<TreeNode*>dl;
        dl.push(root);
        while(!dl.empty()){
            if(dl.front()==NULL)res+="null";
            else {res+=to_string(dl.front()->val);
            dl.push(dl.front()->left);
            dl.push(dl.front()->right);}
            dl.pop();
            res+=',';
        }
        return res;
    }

2.反序列化
这里我自己是先把字符串变成一个整数数组,再使用队列进行反序列化

vector<int> getnodes(string data){
        vector<int>res;
        for (int i = 0, j = 0; i <= data.size(); ++i){
            if (data[i] == ','||i==data.size()){
                string temp=data.substr(j, i - j );
                if (temp != "null")
                    res.push_back(stoi(temp));
                else res.push_back(INT_MAX);
                j = i + 1;
            }
        }
        return res;
    }
    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        if (data == "")return nullptr;
        data.pop_back();
        data.erase(data.begin());
        vector<int>str=getnodes(data);
        queue<TreeNode*>dl;
        TreeNode* root = new TreeNode(str[0]);
        dl.push(root);
        for(int i=1;i<str.size();){
            TreeNode* cur=dl.front();
            if(cur->val!=INT_MAX){
                TreeNode*leftnode=new TreeNode(str[i]);
                TreeNode*rightnode;
                if(i+1<str.size())rightnode=new TreeNode(str[i+1]);
                else rightnode=new TreeNode(INT_MAX);
                if(leftnode->val!=INT_MAX)cur->left=leftnode;
                if(rightnode->val!=INT_MAX)cur->right=rightnode;
                dl.push(leftnode);
                dl.push(rightnode);
                dl.pop();
                i=i+2;
            }
            else {
                dl.pop();
            }
        }
        return root;  
    }

看网上很多人是使用的stringstream 将字符串变成一个字符串型数组

#include<sstream>  //sstream 主要就是用来进行数据类型的转换
string strresult="100"; //字符串转整数    string strresult;   整数转字符串
int value ;   			//			     int value=100 ;
ss << strresult;		//				 ss<<value;
ss >> value;			//				 ss>>strresult;
vector<string>getstring(string data){
	stringstream ss(data);
	vector<string>res;
	string temp;
	while (getline(ss, temp, ','))res.push_back(temp);
	return res;
}

下面这个是我之前参考别人的代码写的简化版的数组生成二叉树,但是我后来发现它并不适用于全部测试案例,比如:

[1,2,3,null,null,4,5,6,7]  
//会把6,7当做第一个null的子节点

//这个方法如果把两个null的全部子节点也写进来,就可以用了
[1,2,3,null,null,4,5,null,null,null,null,6,7] 

但还是记录一下,感觉方法还是有一些用的
2019年10.29

#include<vector>
#include <iostream>
#include<algorithm>
using namespace std;
 struct TreeNode {
     int val;
     TreeNode *left;
     TreeNode *right;
     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 };
 TreeNode* getTreeNode(vector<int>str){
	 TreeNode* root = new TreeNode(str[0]);
	 vector<TreeNode*> vecs;
	 vecs.push_back(root);
	 for (int i = 1; i < str.size(); i++)
	 {
		 if (str[i]!=NULL)
		 {
			 TreeNode* n1 = new TreeNode(str[i]);
			 if (i % 2 == 1) //left
			 {
				 vecs[(i - 1) / 2]->left = n1;
			 }
			 else
			 {
				 vecs[(i - 1) / 2]->right = n1;
			 }
			 vecs.push_back(n1);
		 }
		 else
		 {
			 vecs.push_back(nullptr);
		 }
	 }
	 return root;
 }
 
void main(){
	vector<int>s = { 1, 2, NULL, 34 };
	TreeNode* root=getTreeNode(s);
	TreeNode* p = new TreeNode(2);
	TreeNode* q = new TreeNode(4);
	//进行相关函数的调用
 	system("pause");
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值