题目要求:
给你二叉树的根结点 root
,请你将它展开为一个单链表:
- 展开后的单链表应该同样使用
TreeNode
,其中right
子指针指向链表中下一个结点,而左子指针始终为null
。 - 展开后的单链表应该与二叉树 先序遍历 顺序相同。
示例 1:
输入:root = [1,2,5,3,4,null,6] 输出:[1,null,2,null,3,null,4,null,5,null,6]
示例 2:
输入:root = [] 输出:[]
示例 3:
输入:root = [0] 输出:[0]
提示:
- 树中结点数在范围
[0, 2000]
内 -100 <= Node.val <= 100
进阶:你可以使用原地算法(O(1)
额外空间)展开这棵树吗?
解法1-递归 O(N) 进阶
先创建一个链表的哨兵位 sen,然后用cur对二叉树进行先序遍历:
遇到空节点就返回,否则将节点加入链表中:
(1)保存节点的左右节点
(2)将节点连接到链表中
(3)cur更新到当前节点,节点左边置空
(4)继续递归左,再递归右
class Solution {
void _flatten(TreeNode* root, TreeNode*& cur) {
if (root == nullptr)
return;
TreeNode* right = root->right;
TreeNode* left = root->left;
cur->right = root; // 连接节点到链表
cur = cur->right; // 更新cur
cur->left = nullptr; // 节点左置空
_flatten(left, cur);
_flatten(right, cur);
}
public:
void flatten(TreeNode* root) {
TreeNode* sen = new TreeNode(); // 哨兵位
TreeNode* cur = sen;
_flatten(root, cur);
root = sen->right;
}
};
1