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

Java通用树(General Tree)实现、插入功能及遍历技术求助

通用树代码实现与疑问解答

1. 通用树完整代码实现

以下是包含插入、遍历功能的完整通用树Java实现:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

class GeneralTree {
    public static class Node {
        String data;
        ArrayList<Node> children; // 用更清晰的变量名指代子节点集合

        // 构造函数初始化子节点列表,避免空指针异常
        Node(String data) {
            this.data = data;
            this.children = new ArrayList<>();
        }

        public String getValue() {
            return data;
        }
    }

    Node root;
    int maxDegree; // 树的最大允许子节点数,0表示无限制
    String type;

    public GeneralTree() {
        maxDegree = 0;
        root = null;
        type = "无限制通用树";
    }

    // 指定根节点和最大度的构造函数
    public GeneralTree(Node root, int maxDegree) {
        this.root = root;
        this.maxDegree = maxDegree;
        this.type = maxDegree > 0 ? "固定度" + maxDegree + "通用树" : "无限制通用树";
    }

    public Node getRoot() {
        return root;
    }

    // 插入节点:将新节点添加到指定父节点下
    public boolean insert(Node parentNode, String newData) {
        // 树为空时,直接将新节点设为根
        if (root == null) {
            root = new Node(newData);
            return true;
        }
        // 父节点为空,插入失败
        if (parentNode == null) {
            return false;
        }
        // 检查是否超过最大子节点数限制
        if (maxDegree > 0 && parentNode.children.size() >= maxDegree) {
            System.out.println("父节点已达最大子节点数限制,插入失败");
            return false;
        }
        // 将新节点加入父节点的子节点列表
        parentNode.children.add(new Node(newData));
        return true;
    }

    // 前序遍历:根节点 -> 依次遍历所有子节点
    public void preorderTraversal(Node node) {
        if (node == null) {
            return;
        }
        System.out.print(node.getValue() + " ");
        for (Node child : node.children) {
            preorderTraversal(child);
        }
    }

    // 后序遍历:依次遍历所有子节点 -> 根节点
    public void postorderTraversal(Node node) {
        if (node == null) {
            return;
        }
        for (Node child : node.children) {
            postorderTraversal(child);
        }
        System.out.print(node.getValue() + " ");
    }

    // 层次遍历:按层级从上到下、从左到右遍历
    public void levelOrderTraversal() {
        if (root == null) {
            return;
        }
        Queue<Node> queue = new LinkedList<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            Node current = queue.poll();
            System.out.print(current.getValue() + " ");
            queue.addAll(current.children);
        }
    }
}

public class Hw5 {
    public static void main(String[] args) {
        // 测试代码
        GeneralTree tree = new GeneralTree();
        // 插入根节点
        tree.insert(null, "Root");
        GeneralTree.Node root = tree.getRoot();
        // 给根节点插入子节点
        tree.insert(root, "Child1");
        tree.insert(root, "Child2");
        // 给Child1插入子节点
        GeneralTree.Node child1 = root.children.get(0);
        tree.insert(child1, "GrandChild1");
        tree.insert(child1, "GrandChild2");

        System.out.println("前序遍历:");
        tree.preorderTraversal(root);
        System.out.println("\n后序遍历:");
        tree.postorderTraversal(root);
        System.out.println("\n层次遍历:");
        tree.levelOrderTraversal();
    }
}

2. 通用树插入函数的工作原理

通用树的插入逻辑核心围绕父节点的子节点列表展开,具体步骤:

  1. 根节点特殊处理:如果树为空(root为null),直接将新节点设为根节点。
  2. 父节点有效性校验:传入的父节点不能为null(非根节点必须依附于父节点),否则插入失败。
  3. 度限制检查:如果树设置了最大允许子节点数(maxDegree>0),需判断父节点当前子节点数量是否已达上限,若达到则拒绝插入。
  4. 添加子节点:创建新节点并将其加入父节点的children列表,完成插入。

和二叉树的区别在于:二叉树用固定的左右指针存储子节点,而通用树用动态列表存储任意数量的子节点,插入时只需向列表追加元素,无需处理指针的复杂分配逻辑。

3. 相关学习资料推荐

  • 《数据结构与算法分析(Java语言描述)》:书中详细讲解了通用树的存储结构、遍历算法,以及通用树转二叉树的实现细节,适合系统学习。
  • 国内高校数据结构课程课件:多数高校计算机专业的课件会包含通用树的原理推导、代码实现案例,能快速帮你理解多子节点结构的核心逻辑。
  • 算法可视化模拟:手动绘制或使用本地可视化工具模拟通用树的插入、遍历过程,直观感受节点列表的动态变化,比纯代码更容易理解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:50:27