leetcode 链接:二叉树展开为链表
题目
给你二叉树的根结点 root ,请你将它展开为一个单链表:
- 展开后的单链表应该同样使用
TreeNode,其中right子指针指向链表中下一个结点,而左子指针始终为null。 - 展开后的单链表应该与二叉树 先序遍历 顺序相同。
示例:![[中等] 114. 二叉树展开为链表 - 图1](/uploads/projects/liangduo-rjrcs@ggu4wq/b3127bb164f7c2575b9794b2abcd5ae5.jpeg)
输入: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% 的用户
