搜了挺多文章,没见到有用Java 写二叉树输入的,于是参照代码随想录的内容自己写了一个~~~
public static void main(String[] args) { int[] nums = new int[]{4, 1, 6, 0, 2, 5, 7, -1, -1, -1, 3, -1, -1, -1, 8}; TreeNode root = createNode(nums); List<List<Integer>> res = levelOrder(root); System.out.println(res); }
// 根据数组构造二叉树
private static TreeNode createNode(int[] nums) { TreeNode[] TreeArr = new TreeNode[nums.length]; TreeNode root = null;
// 把输入数值数组,先转化为二叉树节点数组
for (int i = 0; i < nums.length; i++) { TreeNode node = null; if (nums[i] != -1) { node = new TreeNode(nums[i]); } TreeArr[i] = node; if (i == 0) { root = node; } }
// 遍历一遍,根据规则左右孩子赋值就可以了
// 注意这里 结束规则是 i * 2 + 2 < vec.size(),避免空指针
for (int i = 0; i * 2 + 2 < nums.length; i++) { if (TreeArr[i] != null) {
// 线性存储转连式存储关键逻辑
TreeArr[i].left = TreeArr[i * 2 + 1]; TreeArr[i].right = TreeArr[i * 2 + 2]; } } return root; } private static List<List<Integer>> levelOrder(TreeNode root) { if (root == null) { return new ArrayList<>(); } List<List<Integer>> res = new ArrayList<>(); Queue<TreeNode>queue = new LinkedList<>(); queue.add(root); while(!queue.isEmpty()) { int count = queue.size(); List<Integer> temp = new ArrayList<>(); while(count >0) { TreeNode node = queue.poll(); temp.add(node.val); if (node.left != null) { queue.add(node.left); } if (node.right != null) { queue.add(node.right); } count--; } res.add(temp); } return res; } static class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } }