二叉树的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 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> levelOrder(TreeNode root) {
        // 存储层序遍历的结果
        List> result = new ArrayList<>();
        // 如果根节点为空,直接返回空结果
        if (root == null) {
            return result;
        }

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

        while (!queue.isEmpty()) {
            // 当前层的节点数量
            int levelSize = queue.size();
            // 存储当前层的节点值
            List 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 integers = inorderTraversal(root);
        System.out.println("中序遍历结果:");
        for (Integer integer : integers) {
            System.out.print(integer + " ");
        }
        System.out.println();
        //层序遍历二叉树
        List> result = levelOrder(root);

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

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

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

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


}

二叉树的ACM板子(自用)_第1张图片

结果:

二叉树的ACM板子(自用)_第2张图片

你可能感兴趣的:(windows)