当前位置: 首页 > news >正文

二叉树的ACM板子(自用)

package 二叉树的中序遍历;

import java.util.*;

// 定义二叉树节点
class TreeNode {
    int val;        // 节点值
    TreeNode left;  // 左子节点
    TreeNode right; // 右子节点

    // 构造函数
    TreeNode(int x) {
        val = x;
    }
}

public class DMain {
    // 构建二叉树(层序遍历方式)
    public static TreeNode buildTree(Integer[] nums) {
        // 如果输入数组为空或第一个节点为null,直接返回空树
        if (nums == null || nums.length == 0 || nums[0] == null) {
            return null;
        }

        // 创建根节点
        TreeNode root = new TreeNode(nums[0]);
        // 使用队列辅助构建二叉树
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root); // 将根节点加入队列

        int index = 1; // 从数组的第二个元素开始处理
        while (!queue.isEmpty() && index < nums.length) {
            // 从队列中取出当前节点
            TreeNode node = queue.poll();

            // 处理左子节点
            if (nums[index] != null) {
                node.left = new TreeNode(nums[index]); // 创建左子节点
                queue.offer(node.left); // 将左子节点加入队列
            }
            index++; // 移动到下一个元素

            // 处理右子节点
            if (index < nums.length && nums[index] != null) {
                node.right = new TreeNode(nums[index]); // 创建右子节点
                queue.offer(node.right); // 将右子节点加入队列
            }
            index++; // 移动到下一个元素
        }

        // 返回构建好的二叉树的根节点
        return root;
    }

    // 迭代的层序遍历
    public static List<List<Integer>> levelOrder(TreeNode root) {
        // 存储层序遍历的结果
        List<List<Integer>> result = new ArrayList<>();
        // 如果根节点为空,直接返回空结果
        if (root == null) {
            return result;
        }

        // 使用队列辅助层序遍历
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root); // 将根节点加入队列

        while (!queue.isEmpty()) {
            // 当前层的节点数量
            int levelSize = queue.size();
            // 存储当前层的节点值
            List<Integer> level = new ArrayList<>();

            // 遍历当前层的所有节点
            for (int i = 0; i < levelSize; i++) {
                TreeNode node = queue.poll(); // 从队列中取出当前节点
                level.add(node.val); // 将当前节点的值加入当前层的列表

                // 将当前节点的左子节点加入队列
                if (node.left != null) {
                    queue.offer(node.left);
                }
                // 将当前节点的右子节点加入队列
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }

            // 将当前层的节点值列表加入结果列表
            result.add(level);
        }

        // 返回层序遍历的结果
        return result;
    }

    // 主函数
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入二叉树(用,分隔,null表示空节点):");
        String s=sc.nextLine();
        String[] str=s.split(",");
        Integer[] nums=new Integer[str.length];
        for (int i = 0; i < str.length; i++) {
            if (str[i].equals("null")) {
                nums[i] = null;
            }else{
                nums[i] = Integer.parseInt(str[i]);
            }
        }


        // 构建二叉树
        TreeNode root = buildTree(nums);

        // 中序遍历二叉树
        List<Integer> integers = inorderTraversal(root);
        System.out.println("中序遍历结果:");
        for (Integer integer : integers) {
            System.out.print(integer + " ");
        }
        System.out.println();
        //层序遍历二叉树
        List<List<Integer>> result = levelOrder(root);

        // 输出层序遍历结果
        System.out.println("层序遍历结果:");
        for (List<Integer> level : result) {
            for (int val : level) {
                System.out.print(val + " ");
            }
            System.out.println();
        }
    }

    public static List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        inorder(root, list);
        return list;
    }

    public static void inorder(TreeNode root, List<Integer> list) {
        if (root == null) {
            return;
        }

        inorder(root.left, list);
        list.add(root.val);
        inorder(root.right, list);
    }


}

结果:

http://www.dtcms.com/a/106799.html

相关文章:

  • 网管平台核心功能解析(七)——IP管理
  • 【Neo4j介绍】
  • web网页上实现录音功能(vue3)
  • 大模型加速器2.0:构建智能知识库,助力大模型减少“幻觉”
  • 【dp + 裴蜀定理】P8646 [蓝桥杯 2017 省 AB] 包子凑数 题解
  • ubuntu中使用安卓模拟器
  • DeepBI如何深入了解竞品的广告策略和运营动机
  • 电子竞技战队网站设计与实现(ssm+jsp+mysql)含万字详细文档
  • einsum函数
  • 技术回顾day3
  • 大语言模型在端到端智驾中的应用
  • 【Ragflow】9.问答为什么比搜索响应慢?从源码角度深入分析
  • 社交类 APP 设计:打造高用户粘性的界面
  • LE AUDIO CIS连接建立失败问题分析
  • 6.git项目实现变更拉取与上传
  • C++虚函数与抽象类
  • 使用 libevent 处理 TCP 粘包问题(基于 Content-Length 或双 \r\n)
  • 操作系统高频(七)虚拟地址与页表
  • ADASH VA5 Pro中的route功能
  • electron 的 appData 和 userData 有什么区别
  • SPI高级特性分析
  • JavaScript instanceof 运算符全解析
  • 「DeepSeek-V3 技术解析」:无辅助损失函数的负载均衡
  • 双模多态驱动:DeepSeek-V3-0324与DeepSeek-R1医疗领域应用比较分析与混合应用讨论
  • 移动通信网络中漫游机制深度解析:归属网络与拜访网络的协同逻辑
  • PHP的相关配置和优化
  • openstack 查看所有项目配额的命令
  • SU CTF 2025 web 复现
  • tcp的粘包拆包问题,如何解决?
  • 【深度学习量化交易21】行情数据获取方式比测(2)——基于miniQMT的量化交易回测系统开发实记