前言
在leetcode做题时,一些关于树的题目,在本地编译器很难调试,主要的原因是无法获得测试用例。这也是长期困扰笔者的一个问题,所以“被迫”实现了用 vector 数组建树的代码,方便生成想要的测试用例。这里把它分享出来,或许你也需要。
代码
TreeNode * createTree(vector<int>v) {
if (v.empty()) {
return nullptr;
}
//使用逐层遍历的方式,生成树
queue<TreeNode*>q;
TreeNode* root = new TreeNode(v[0]);
q.push(root);
int idx = 1;//用以表示当前数组可用的元素下标
while (!q.empty()&&idx<v.size()) {
int cnt = q.size();
for (int i = 1; i <= cnt; i++) {
TreeNode* cur = q.front();
q.pop();
//判断左子树是否为空
if (v[idx] != -1) {
TreeNode* t = new TreeNode(v[idx]);
cur->left = t;
q.push(cur->left);
}
idx++;
if (idx >= v.size()) {
break;
}
//判断右子树是否为空
if (v[idx] != -1) {
TreeNode* t = new TreeNode(v[idx]);
cur->right = t;
q.push(cur->right);
}
idx++;
}
}
return root;
}
//main函数中调用代码
int main() {
/*
-1表示空节点,也就意味着val不能等于-1;
当然你可以稍微改一下createTree的源码,以实现你的个性要求
输入数据形如 vector<int>v = {1,2,3,-1,-1,4,5} 最后一层的叶子节点的空节点不用指明
*/
vector<int>v = {1,2,3,-1,-1,4,5};
TreeNode* root=createTree(v);//root就是测试用例的根节点
Solution *temp = new Solution();
temp->connect(root);
return 0;
}
使用说明
- 步骤
- 把createTree函数复制到自己的main函数前
- 在main函数中,改动数组 v 的初始化元素,以建成自己想要的树
- 数组 v 元素要怎么推算呢?如下图的树,
vector<int>v = {3,9,20,-1,-1,15,7};
- 即节点 9 的两个子节点为空,要用 -1 指明;而节点 15 和节点 7 不需要,因为它们已经是最后一层了。
- 如果你熟悉 leetcode 的用例输入,那么只是把其中的 null 改成 -1就可以了
写在后面
- 代码的正确性自测ok,但数据量不大,不排除有未知的 bug 存在。请谅解,谢谢!
- 如有不足或高见,欢迎交流。交流使我们更有力量!
-------------------------------------------------- end!-----------------------------------------------------