import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param root TreeNode类
     * @return TreeNode类
     */
    ArrayList<Integer> ans = new ArrayList<>();
    public TreeNode flattenTree (TreeNode root) {
        // write code here
        if (root == null)
            return null;
        pre(root);
        int n = ans.size();
        TreeNode root1 = new TreeNode(ans.get(0));
        TreeNode croot = root1;
        for (int i = 1; i < n; i++) {
            TreeNode node = new TreeNode(ans.get(i));
            root1.left = null;
            root1.right = node;
            root1 = node;
        }
        root1.left = null;
        root1.right = null;
        return croot;
    }

    public void pre(TreeNode root) {
        if (root == null)
            return;
        ans.add(root.val);
        pre(root.left);
        pre(root.right);
    }
}

这段代码使用的编程语言是Java。

该题考察的知识点有二叉树的遍历和链表的操作。

代码解释如下:

  1. 首先定义了一个 TreeNode 类,表示二叉树节点。每个节点包含一个整数值 val,以及左子节点 left 和右子节点 right。
  2. 然后定义了一个 Solution 类,其中包含了 flattenTree 方法。
  3. flattenTree 方法接收一个二叉树的根节点 root 作为参数。它首先判断根节点是否为空,如果为空则直接返回空。
  4. 创建一个列表 ans,用来保存前序遍历的结果。
  5. 调用辅助方法 pre 进行前序遍历,将节点的值保存到列表 ans 中。
  6. 获取列表 ans 的长度 n。
  7. 创建一个新的节点 root1,值为列表 ans 的第一个节点值。
  8. 创建一个指针 croot,指向链表的头节点。
  9. 使用循环遍历列表 ans 的剩余节点,从索引1开始。在循环中,创建一个新的节点 node,值为当前遍历到的节点值。
  10. 将当前节点 node 连接到链表中,即将 root1 的左子节点置为 null,右子节点置为 node。
  11. 更新 root1 的位置为当前节点 node,作为下一次循环时的尾部节点。
  12. 循环结束后,将 root1 的左子节点和右子节点置为 null,即形成了展开后的链表。
  13. 返回链表的头节点 croot 作为结果。

该代码实现了将二叉树展开为链表的功能。通过前序遍历二叉树获取节点值的顺序,并根据节点值构建链表。最终得到的链表是以原二叉树的前序遍历顺序展开的。