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