在写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, 3,4 };
TreeNode* root=getTreeNode(s);
TreeNode* p = new TreeNode(2);
TreeNode* q = new TreeNode(4);
//进行相关函数的调用
system("pause");
}