[C++] 转化LeetCode的测试用例字符串为输入的二叉树

[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;
}

如此即可生成所需的树结构,可传入写入的函数用于调试代码。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值