题目
给定一个二叉树,原地将它展开为一个单链表。
思路
- 找到左子树的最右边节点
- 将右子树接到左子树的最右边节点
- 将左子树插入到原先右子树的位置
- 考虑新的右子树的节点,一直重复上边的过程,直到新的右子树为 null
复杂度分析
假设树有 n 个节点。
- 时间复杂度O(n),遍历整棵树。
- 空间复杂度O(1),空间复杂度为常数。
代码
class Solution {
public void flatten(TreeNode root) {
while (root != null){
if (root.left == null){
root = root.right;
}else {
TreeNode pre = root.left;
while (pre.right != null){
pre = pre.right;
}
pre.right = root.right;
root.right = root.left;
root.left = null;
root = root.right;
}
}
}
}