leetcode 链接:二叉树展开为链表
题目
给你二叉树的根结点 root
,请你将它展开为一个单链表:
- 展开后的单链表应该同样使用
TreeNode
,其中right
子指针指向链表中下一个结点,而左子指针始终为null
。 - 展开后的单链表应该与二叉树 先序遍历 顺序相同。
示例:
输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]
输入:root = []
输出:[]
输入:root = [0]
输出:[0]
解答 & 代码
解法一:后序遍历
/**
* 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) {
// 递归结束条件
if(root == nullptr)
return;
// 1. 递归将左、右子树展开为链表
flatten(root->left);
flatten(root->right);
/**** 后序位置 ****/
TreeNode* left = root->left;
TreeNode* right = root->right;
// 2. 将 root 的左子树作为链表的下一个节点(right)
root->left = nullptr;
root->right = left;
// 3. 定位到 root 原左子树的末端,将其 right 指向 root 原右子树头部
TreeNode* cur = root;
while(cur->right != nullptr)
cur = cur->right;
cur->right = right;
}
};
复杂度分析:?
执行结果:
执行结果:通过
执行用时:4 ms, 在所有 C++ 提交中击败了 85.36% 的用户
内存消耗:12.4 MB, 在所有 C++ 提交中击败了 43.05% 的用户
解法二:前序遍历
/**
* 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 {
private:
TreeNode* pre; // 当前遍历到的节点的前一个节点
// 前序遍历二叉树,同时展开为链表
void preOrder(TreeNode* root)
{
// 递归结束条件
if(root == nullptr)
return;
// 先序位置:处理当前节点
pre->right = root; // 将前一节点和当前节点相连
TreeNode* left = root->left; // 左子树节点
TreeNode* right = root->right; // 右子树节点
root->left = nullptr; // 将当前节点的左子树置空
pre = root; // 更新前一节点 pre 为当前节点 root
// 递归处理左、右子树
preOrder(left);
preOrder(right);
}
public:
void flatten(TreeNode* root) {
TreeNode* dummyHead = new TreeNode();
pre = dummyHead; // 初始化 pre 为虚拟头节点
preOrder(root);
}
};
复杂度分析:设二叉树共 N 个节点
- 时间复杂度 O(N):遍历每个节点一次
- 空间复杂度 O(log N):栈空间取决于递归深度,即二叉树的高度
执行结果:
执行结果:通过
执行用时:4 ms, 在所有 C++ 提交中击败了 85.36% 的用户
内存消耗:12.4 MB, 在所有 C++ 提交中击败了 57.12% 的用户