二叉树的层序遍历
给你二叉树的根节点 root ,返回它节点值的层序遍历。
层序遍历:
按照层级,从上往下,从左到右。使用广度优先搜索算法。
上图打印顺序应该为:1 2 3 4 5 6 7
package od1; import common.TreeNode; import java.util.LinkedList; import java.util.Queue; /** * 层序(按顺序打印元素) * 给你二叉树的根节点root ,返回它节点值的层序遍历。 * 原文地址:https://www.codernav.com/2864.html * 更多算法详解:https://www.codernav.com */ public class OdTest37 { public static void main(String[] args) { TreeNode node7 = new TreeNode(7, null, null); TreeNode node6 = new TreeNode(6, null, null); TreeNode node5 = new TreeNode(5, node6, node7); TreeNode node4 = new TreeNode(4, null, null); TreeNode node3 = new TreeNode(3, null, null); TreeNode node2 = new TreeNode(2, node4, node5); TreeNode node1 = new TreeNode(1, node2, node3); f(node1); } private static void f(TreeNode root) { Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { TreeNode poll = queue.poll(); if (poll != null) { System.out.println(poll.val); queue.offer(poll.left); queue.offer(poll.right); } } } }
package od1; import common.TreeNode; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue; /** * 层序(按每层元素放一个数组返回,对应leetcode.102题) * 给你二叉树的根节点root ,返回它节点值的层序遍历。 * 原文地址:https://www.codernav.com/2864.html * 更多算法详解:https://www.codernav.com */ public class OdTest37 { public static void main(String[] args) { TreeNode node7 = new TreeNode(7, null, null); TreeNode node6 = new TreeNode(6, null, null); TreeNode node5 = new TreeNode(5, node6, node7); TreeNode node4 = new TreeNode(4, null, null); TreeNode node3 = new TreeNode(3, null, null); TreeNode node2 = new TreeNode(2, node4, node5); TreeNode node1 = new TreeNode(1, node2, node3); f(node1); } private static List<List<Integer>> f(TreeNode root) { List<List<Integer>> lists = new ArrayList<>(); if (root == null) { return lists; } // 定义一个先进先出的队列,放入根节点 Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { // 用于记录每层的节点数,每从队列中取出一个元素,size-- int size = queue.size(); // 存放每层的元素 List<Integer> list = new ArrayList<>(); // 题目要求每层单独放一个数组中,用这种方式记录上层循环放入队列的个数 while (size > 0) { // 取出元素 TreeNode node = queue.poll(); list.add(node.val); if (node.left != null) { queue.offer(node.left); } if (node.right != null) { queue.offer(node.right); } size--; } lists.add(list); } return lists; } }
队列:
只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特性。
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...