2014-03-19 03:40

题目:给定一棵二叉树,把每一层的节点串成一个链表,最终返回一个链表数组。

解法:前序遍历,遍历的同时向各个链表里添加节点。水平遍历好像还不如前序遍历来得方便。

代码:

 // 4.4 Level order traversal
#include <cstdio>
#include <vector>
using namespace std; struct TreeNode {
int val;
TreeNode *left;
TreeNode *right; TreeNode(int _val = ): val(_val), left(nullptr), right(nullptr) {};
}; struct ListNode {
int val;
ListNode *next; ListNode(int _val = ): val(_val), next(nullptr) {};
}; void consructBSTFromSortedArray(vector<int> &v, int left, int right, TreeNode *&root)
{
if (left > right) {
root = nullptr;
} else {
int mid = (left + right + ) / ;
root = new TreeNode(v[mid]);
consructBSTFromSortedArray(v, left, mid - , root->left);
consructBSTFromSortedArray(v, mid + , right, root->right);
}
} void preorderTraversal(TreeNode *root, vector<ListNode *> &listHeads, vector<ListNode *> &listTails, int depth)
{
if (root == nullptr) {
printf("# ");
} else {
while ((int)listHeads.size() < depth) {
listHeads.push_back(nullptr);
listTails.push_back(nullptr);
} if (listHeads[depth - ] == nullptr) {
listHeads[depth - ] = listTails[depth - ] = new ListNode(root->val);
} else {
listTails[depth - ]->next = new ListNode(root->val);
listTails[depth - ] = listTails[depth - ]->next;
} printf("%d ", root->val);
preorderTraversal(root->left, listHeads, listTails, depth + );
preorderTraversal(root->right, listHeads, listTails, depth + );
}
} void clearBinaryTree(TreeNode *&root)
{
if (root == nullptr) {
return;
} else {
clearBinaryTree(root->left);
clearBinaryTree(root->right);
delete root;
root = nullptr;
}
} void clearList(ListNode *&root)
{
ListNode *ptr; ptr = root;
while (ptr != nullptr) {
root = root->next;
delete ptr;
ptr = root;
}
root = nullptr;
} int main()
{
TreeNode *root;
int i, n;
vector<int> v;
vector<ListNode *> listHeads, listTails;
ListNode *ptr; while (scanf("%d", &n) == && n > ) {
for (i = ; i < n; ++i) {
v.push_back(i + );
} consructBSTFromSortedArray(v, , n - , root);
preorderTraversal(root, listHeads, listTails, );
printf("\n"); for (i = ; i < (int)listHeads.size(); ++i) {
printf("Level %d:", i + );
ptr = listHeads[i];
while (ptr != nullptr) {
printf(" %d", ptr->val);
ptr = ptr->next;
}
printf("\n");
clearList(listHeads[i]);
} v.clear();
clearBinaryTree(root);
listHeads.clear();
listTails.clear();
} return ;
}

最新文章

  1. session详解
  2. 在sqlserver中做fibonacci(斐波那契)规律运算
  3. Cocos2d-x环境搭建
  4. 怎样解决:未找到路径“……”的控制器或该控制器未实现 IController?
  5. Java [leetcode 17]Letter Combinations of a Phone Number
  6. Q105971:Converting a Regular GUID to a Compressed GUID
  7. 命令行命令mvn
  8. Hot Research Topics
  9. 【node】安装和配置node项目文件
  10. AngularJS进阶(二十三)ANGULAR三宗罪之版本陷阱
  11. SpringCloud实战-Hystrix线程隔离&amp;请求缓存&amp;请求合并
  12. 从今天开始慢慢阅读java9源码决心的声明。
  13. 多级nginx代理,获取客户端真实ip
  14. [20190227]简单探究tab$的bojb#字段.txt
  15. jquery()后续版本中,live()取消后使用on()实现功能写法
  16. 步步为营-70-asp.net简单练习(文件的上传和下载)
  17. 【Devops】【docker】【CI/CD】1.docker搭建Gitlab环境
  18. 关于C#事件的理解
  19. 【序列莫队+树状数组】BZOJ3289-Mato的文件管理
  20. C#中Cache的使用

热门文章

  1. AFNetworking 使用总结 (用法+JSON解析
  2. 火车进站输出路径(HDU1022)
  3. vuejs样式绑定
  4. 深入浅出Nginx
  5. 2017.10.14 Java的流程控制语句switch&amp;&amp;随机点名器
  6. Java的感受
  7. Vuex基础-Action
  8. java设计模式——迭代器模式
  9. MySQL-常用的存储引擎
  10. Webpack4 学习笔记一初探Webpack