114.二叉树展开为链表


题目: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
  • 进阶:
进阶:你可以使用原地算法(O(1) 额外空间)展开这棵树吗?

思路

  • 我们可以通过递归的方式前序遍历二叉树。

  • 前序遍历二叉树, 把节点按照前序遍历的顺序放入list中。

  • 把list中的值取出来并放在current节点的右子树。

  • 时间复杂度:O(n)

  • 空间复杂度:O(n)

代码

public void flatten(TreeNode root) {
    TreeNode current = new TreeNode();
    List<TreeNode> list = new LinkedList<>();
    // 前序遍历二叉树, 把节点按照前序遍历的顺序放入list中
    preorderHelper(list, root);
    // 把list中的值取出来并放在current节点的右子树
    for (TreeNode treeNode : list) {
        current.left = null;
        current.right = treeNode;
        current = current.right;
    }
}

private void preorderHelper(List<TreeNode> list, TreeNode node) {
    if (node == null) {
        return;
    }
    // 访问根节点
    list.add(node);
    // 访问左子树
    preorderHelper(list, node.left);
    // 访问右子树
    preorderHelper(list, node.right);
}

文章作者: cxyexe
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 cxyexe !
  目录