Leetcode114. 二叉树展开为链表

Leetcode114. 二叉树展开为链表

题目描述

 /**
     * 给你二叉树的根结点 root ,请你将它展开为一个单链表:
     * <p>
     * 展开后的单链表应该同样使用 TreeNode ,
     * 其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
     * 展开后的单链表应该与二叉树 先序遍历 顺序相同。
     */

思路分析

  1. 二叉树展开为列表,展开后结构仍为树结构,只是左指针为空,右指针指向下一节点
  2. 要求顺序和前序遍历顺序相同,可以先使用前序遍历,将各个节点的值保存到集合中
  3. 然后遍历存储节点的列表,每次取出两个节点,让第一个节点的左子树为空,右子树指向第二个节点,直到遍历完所有的节点
  4. 则将其展开为一个单链表
  5. 源码见下

源码及分析

/**
     *
     * @param root 二叉树根节点
     */
    public void flatten(TreeNode root) {
        //定义集合保存按照前序遍历顺序的节点
        ArrayList<TreeNode> list = new ArrayList<>();
        preOrder(root, list);
        int size = list.size();
        //遍历集合中节点,形成链表关系
        for (int i = 1; i < size; i++) {
            TreeNode pre = list.get(i - 1);
            TreeNode cur = list.get(i);
            pre.left = null;
            pre.right = cur;
        }
    }

    //前序遍历
    public void preOrder(TreeNode root, List<TreeNode> list) {
        if (root != null) {
            list.add(root);
            preOrder(root.left, list);
            preOrder(root.right, list);
        }
    }
posted @ 2021-09-16 15:16  mx_info  阅读(28)  评论(0)    收藏  举报