网站首页 > 文章精选 正文
二叉树展开为链表
- 迭代实现 先序遍历,同时进行链表链接操作。
题目描述
给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。 展开后的单链表应该与二叉树 先序遍历 顺序相同。
示例:
输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]
C++实现
/**
* Definition for a binary tree node.
* 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) {}
* };
*/
class Solution {
public:
void flatten(TreeNode* root) {
// 1. 迭代先序遍历 -> vector
// 2. vector 转为链表
if (!root) {
return;
}
vector<TreeNode *> vec;
stack<TreeNode *> stk;
stk.push(root);
TreeNode *prev = nullptr;
while (!stk.empty()) {
auto q = stk.top();
stk.pop();
if (prev) {
prev->right = q;
prev->left = nullptr;
}
if (q->right) {
stk.push(q->right);
}
if (q->left) {
stk.push(q->left);
}
prev = q;
}
// int n = vec.size();
// for (int i = 1; i < n; i++) {
// vec[i-1]->right = vec[i];
// vec[i-1]->left = nullptr;
// }
// vec[n-1]->right = nullptr;
// vec[n-1]->left = nullptr;
// TreeNode *prev = nullptr;
// for (auto & e : vec) {
// if (prev) {
// prev->right = e;
// prev->left = nullptr;
// }
// prev = e;
// }
// prev->left = nullptr;
// prev->right = nullptr;
}
};
golang实现
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func flatten(root *TreeNode) {
// 迭代 + 转为链表
if root == nil {
return
}
var prev *TreeNode
stk := []*TreeNode{root}
for len(stk) > 0 {
n := len(stk)
curr := stk[n-1]
stk = stk[:n-1]
if prev != nil {
prev.Right = curr
prev.Left = nil
}
if curr.Right != nil {
stk = append(stk, curr.Right)
}
if curr.Left != nil {
stk = append(stk, curr.Left)
}
prev = curr
}
}
猜你喜欢
- 2025-05-15 C语言创建链表
- 2025-05-15 看一遍就理解,图解单链表反转
- 2025-05-15 C++:挑战鹅厂面试题(一)--反转链表
- 2025-05-15 数据结构:单链表算法题,常见技巧套路心得分享
- 2025-05-15 那些经典算法:跳表
- 2025-05-15 数据结构错题收录(十八)
- 2025-05-15 数据结构与算法——带你走进循环链表的相关操作
- 05-15C语言创建链表
- 05-15看一遍就理解,图解单链表反转
- 05-15C++:挑战鹅厂面试题(一)--反转链表
- 05-15数据结构:单链表算法题,常见技巧套路心得分享
- 05-15那些经典算法:跳表
- 05-15数据结构错题收录(十八)
- 05-15数据结构与算法——带你走进循环链表的相关操作
- 05-15二叉树展开为链表-迭代法
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)