Java 一维数组转换 N 叉树结构

最近在 LeetCode 刷题,发现遇到不少 N 叉树类型的题目,题目会定义好树节点 Node 的数据结构。

Node

Node 的数据结构如下:

public class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};

在题目的示例中,N 叉树的输入都是一个一维数组,表示这个 N 叉树结构。

例如:

输入:root = [1,null,3,2,4,null,5,6]

表示的 N 叉树为:

image-20210319111845206

因此在 IDE 里面编码调试时,需要一个转化方法方便自己编写并运行测试用例。

转换 N 叉树

一维数组转换 N 叉树结构:

public class NodeUtil {

    /**
     * LeetCode 上的一维数组转 N 叉树
     * @param array
     * @return
     */
    public static Node arrayToNode(Integer[] array) {
        if (array.length == 0) {
            return null;
        }
        Node root = new Node(array[0]),midNode=root;
        List<Node> nodeList = new ArrayList<>();
        int listIndex = 0;
        for (int i = 1; i < array.length; i++) {
            if (array[i] == null) {
                if (listIndex+1<nodeList.size()){
                    midNode = nodeList.get(listIndex);
                    listIndex++;
                } else {
                    nodeList.clear();
                }
                continue;
            }
            if (midNode.children==null){
                midNode.children = new ArrayList<>();
            }
            Node node = new Node(array[i]);
            nodeList.add(node);
            midNode.children.add(node);
        }
        return root;
    }
}

使用方式:

Node node = NodeUtil.arrayToNode(new Integer[]{1,null,3,2,4,null,5,6});

测试用例

表示 N 叉树

以下 N 叉树:

image-20210319112127643

可以表示为:

Node node = NodeUtil.arrayToNode(new Integer[]{1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14});