[C++] 转化LeetCode的测试用例字符串为输入的二叉树
LeetCode中关于二叉树的题目,给出的测试用例是类似[1,2,3,4,null,5,6,null,null,null,7,8,null]
这样的一个伪数组,对于非会员的用户来说,如需调试,则需要自行将其转化为树结构。
本文给出一种示例,通过将测试用例以字符串的形式输入,转化为树结构后返回树根节点,从而便于自行调试。
树结构定义
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr)
{
}
TreeNode(int x) : val(x), left(nullptr), right(nullptr)
{
}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right)
{
}
};
转换输入字符串为节点
std::vector<std::string> str_2_nums(const std::string &str)
{
std::vector<std::string> ans;
std::istringstream sstream{
std::string{str.begin() + 1, str.end() - 1} // 去除首位的中括号
};
for (std::string tmp; std::getline(sstream, tmp, ',');) // 分割字符串
{
if (!tmp.empty())
{
ans.emplace_back(tmp);
}
}
return ans;
}
转换节点为树
#define OVERSIZE(_X_, CONTAINER) (_X_ >= CONTAINER.size())
TreeNode *create_tree(const std::vector<std::string> &nums)
{
constexpr char null_node[]{"null"};
if (nums.empty())
{
return nullptr;
}
auto root = new TreeNode(std::stoi(nums.at(0)));
if (1ull == nums.size())
{
return root;
}
// 转换方法类似BFS
// 详细规则见https://support.leetcode.cn/hc/kb/article/1567641/
std::queue<TreeNode *> q;
q.push(root);
size_t index = 1ull;
while (!q.empty())
{
auto len = q.size();
for (size_t i = 0ull; i < len; ++i)
{
auto tmp_node = q.front();
q.pop();
if (!OVERSIZE(index, nums) && nums.at(index) != null_node)
{
tmp_node->left = new TreeNode(std::stoi(nums.at(index)));
q.push(tmp_node->left);
}
if (!OVERSIZE(index + 1, nums) && nums.at(index + 1) != null_node)
{
tmp_node->right = new TreeNode(std::stoi(nums.at(index + 1)));
q.push(tmp_node->right);
}
index += 2;
}
}
return root;
}
注:此处的代码只申请了内存,并未释放,如需释放请自行编写
简单示例
#include <bits/stdc++.h>
int main()
{
std::vector<std::string> datas{str_2_nums("[1,2,3,4,null,5,6,null,null,null,7,8,null]")};
TreeNode *root = create_tree(datas);
return 0;
}
如此即可生成所需的树结构,可传入写入的函数用于调试代码。