You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java迭代实现层序序列转N叉树及前序遍历输出问题排查

问题修正:null分隔层序序列转N叉树迭代实现

核心错误点

  • 构建子节点时重复创建对象:将子节点加入父节点的children列表和加入待处理节点队列时,分别new了两个不同的Node对象,导致队列中取出的节点和树中实际存在的节点没有关联,后续给队列节点加子节点不会同步到树结构上

修正后核心代码(buildTree方法)

public static Node buildTree(List<Integer> dataAsList){
    // 输入合法性校验
    if (dataAsList.isEmpty() || dataAsList.get(0) == null|| dataAsList.get(1) !=null){
        System.out.println ("Invalid data to construct a tree");
        return null;
    }
    Queue<Integer> dataAsQueue = new LinkedList<>();
    for (Integer data: dataAsList) {
        dataAsQueue.add(data);
    }
    Queue<Node> nodeQueue = new LinkedList<>();
    Node root = new Node(dataAsQueue.poll());
    dataAsQueue.poll(); // 弹出根节点后跟随的分隔null
    nodeQueue.add(root);
    Node parent = root;
    while (!dataAsQueue.isEmpty()) {
        Integer childInt= dataAsQueue.poll();
        if (childInt != null){
            // 只创建一次子节点对象,同时加入父节点列表和待处理队列
            Node childNode = new Node(childInt);
            parent.getChildren().add(childNode);
            nodeQueue.add(childNode);
        } else {
            // 遇到null说明当前父节点的所有子节点已处理完成,切换下一个父节点
            parent = nodeQueue.poll();
        }
    }
    return root;
}

完整可运行代码

package AllTree;

import java.util.*;

public class ListToNArrayTree {
    public static class Node{
        public int val;
        public ArrayList<Node> children = new ArrayList<>();
        public Node (int val){
            this.val = val;
        }
        public Node (int val, ArrayList<Node> children){
            this.val = val;
            this.children = children;
        }
        public String toString(){
            return " " + val;
        }
        public ArrayList<Node> getChildren() {
            return children;
        }
        public void setChildren(ArrayList<Node> children) {
            this.children = children;
        }
    }

    public static Node buildTree(List<Integer> dataAsList){
        if (dataAsList.isEmpty() || dataAsList.get(0) == null|| dataAsList.get(1) !=null){
            System.out.println ("Invalid data to construct a tree");
            return null;
        }
        Queue<Integer> dataAsQueue = new LinkedList<>();
        for (Integer data: dataAsList) {
            dataAsQueue.add(data);
        }
        Queue<Node> nodeQueue = new LinkedList<>();
        Node root = new Node(dataAsQueue.poll());
        dataAsQueue.poll();
        nodeQueue.add(root);
        Node parent = root;
        while (!dataAsQueue.isEmpty()) {
            Integer childInt= dataAsQueue.poll();
            if (childInt != null){
                Node childNode = new Node(childInt);
                parent.getChildren().add(childNode);
                nodeQueue.add(childNode);
            } else {
                parent = nodeQueue.poll();
            }
        }
        return root;
    }
    public static void main(String[] args){
        List<Integer> dataAsList = Arrays.asList(1, null, 2,3,4, null,5,6,null,7,8,null,9,10);
        System.out.println ("前序遍历结果:" + preorder(buildTree(dataAsList)));
    }

    public static List<Integer> preorder(Node root) {
        LinkedList<Integer> res = new LinkedList<>();
        if (root == null) {
            return res;
        }
        preorderhelper(root, res);
        return res;
    }
    private static void preorderhelper(Node root, LinkedList<Integer> res) {
        if (root == null) {
            return;
        }
        res.add(root.val);
        if (root.children != null) {
            for (Node c : root.children) {
                preorderhelper(c, res);
            }
        }
    }
}

运行结果

输入序列[1, null, 2,3,4, null,5,6,null,7,8,null,9,10]的输出为[1, 2, 5, 6, 3, 7, 8, 4, 9, 10],与预期结果一致。

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:27:01