LeetCode Java刷题笔记— 114. 二叉树展开为链表

Posted 刘Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode Java刷题笔记— 114. 二叉树展开为链表相关的知识,希望对你有一定的参考价值。

114. 二叉树展开为链表

给你二叉树的根结点 root ,请你将它展开为一个单链表:

  1. 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。

  2. 展开后的单链表应该与二叉树 先序遍历 顺序相同。

中等难度,最简单的方法是使用先序遍历找到节点对应的顺序集合,然后再对集合中的元素进入引用关联。

public void flatten(TreeNode root) 
    List<TreeNode> list = new ArrayList<TreeNode>();
    //先序遍历获取节点的顺序集合
    preorderTraversal(root, list);
    int size = list.size();
    //集合中的元素按照顺序展开为链表
    for (int i = 1; i < size; i++) 
        TreeNode prev = list.get(i - 1), curr = list.get(i);
        prev.left = null;
        prev.right = curr;
    


public void preorderTraversal(TreeNode root, List<TreeNode> list) 
    if (root != null) 
        list.add(root);
        preorderTraversal(root.left, list);
        preorderTraversal(root.right, list);
    

这种方法涉及到递归,明显需要额外的空间,无法达到O(1)的空间复杂度。我们需要采用另一种方法。

将当前节点的右子树放在当前节点的左子节点的右子树的最右节点下面,如此的循环,直到右子树为null。

public void flatten(TreeNode root) 
    while (root != null) 
        //遍历左子树
        if (root.left != null) 
            TreeNode next = root.left;
            //寻找当前节点的右子节点的临时前驱节点
            //当前节点的左子节点的右子树的最右下节点就是当前节点的右子节点的前驱节点
            //注意这里的关系并不一定是最终的关系
            TreeNode preNode = next;
            while (preNode.right != null) 
                preNode = preNode.right;
            
            preNode.right = root.right;
            root.left = null;
            root.right = next;
        
        root = root.right;
    

以上是关于LeetCode Java刷题笔记— 114. 二叉树展开为链表的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode Java刷题笔记—226. 翻转二叉树

LeetCode Java刷题笔记—101. 对称二叉树

LeetCode Java刷题笔记—101. 对称二叉树

LeetCode Java刷题笔记—110. 平衡二叉树

LeetCode Java刷题笔记—98. 验证二叉搜索树

LeetCode Java刷题笔记—106. 从中序与后序遍历序列构造二叉树