LeetCode—114.二叉树展开为链表[Flatten Binary Tree to Linked List]——分析及代码[C++]
一、题目
给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、分析及代码
1. 原地解法
(1)思路
原地解法的关键是,先将子树连接到叶子节点上(不占用非空的 left 或 right 指针),再进一步利用移动后腾出来的空间。
根据题目中树节点的大小序列,想到可以先将根节点的 右子树 连接到 左子树中最右节点 的右指针,再将根节点的 左子树 移到腾出来的 右子树 位置,即清空了根这一层的左子树,完成了根这一层的链表。
从根节点向下迭代,继续上述操作可将整个二叉树展开为以右指针为连接的链表。
(2)代码
class Solution {
public:
void flatten(TreeNode* root) {
TreeNode* node = root;
while (node != NULL) {
if (node->left != NULL) {//左子树若为空,说明这一层已符合链表
TreeNode* l_rnode = node->left;//l_rnode左子树的最右节点
while(l_rnode->right != NULL)
l_rnode = l_rnode->right;
l_rnode->right = node->right;//将右子树连接到左子树的最右节点
node->right = node->left;//左子树移到右子树
node->left = NULL;//删除左子树的指针
}
node = node->right;
}
}
};
(3)结果
执行用时 :8 ms, 在所有 C++ 提交中击败了 85.33% 的用户;
内存消耗 :9.5 MB, 在所有 C++ 提交中击败了 95.37% 的用户。
三、其他
暂无。