题目
题目链接:力扣114:二叉树展开为链表
给你二叉树的根结点 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
解题思路
这题的解法有很多,但我觉得有一种是最简洁,最简单的。
题目要求展开后的二叉树要和原先的二叉树的先序遍历顺序一致,那么可以用回溯法解题。由于回溯法是从底向上的,所以展开的二叉树也要从底向上构建。那么如何构建呢?
因为展开后的二叉树是一个单链表,所以从最底层向上可以看出是原来二叉树的右子树的最底层向上遍历的结果。那就是说展开的单链表是原先的二叉树从右子树开始遍历,再遍历左子树的反向后序遍历。
下图是过程图:
代码(C++)
class Solution {
public:
TreeNode *f;
void flatten(TreeNode* root) {
if (!root)
return ;
flatten(root->right);
flatten(root->left);
root->right = f;
root->left = nullptr;
f = root;
}
};
总结
其他方法都比较麻烦,而且时空间复杂度都差不多,所以只介绍了这一种方法。这一题不能算简单,有一定的难度,尤其是空间复杂度只能是O(1)时,难度就上去了。如果没有这个要求,可以先遍历储存,再重新构建。