北京外贸网站优化,网站如何不被收录,喜迎二十大,网站代运营公司有哪些102.二叉树的层序遍历 广度优先搜索#xff1a;
我们可以想到最朴素的方法是用一个二元组 (node, level) 来表示状态#xff0c;它表示某个节点和它所在的层数#xff0c;每个新进队列的节点的 level 值都是父亲节点的 level 值加一。最后根据每个点的 level 对点进行分类
我们可以想到最朴素的方法是用一个二元组 (node, level) 来表示状态它表示某个节点和它所在的层数每个新进队列的节点的 level 值都是父亲节点的 level 值加一。最后根据每个点的 level 对点进行分类分类的时候我们可以利用哈希表维护一个以 level 为键对应节点值组成的数组为值广度优先搜索结束以后按键 level 从小到大取出所有值组成答案返回即可。
考虑如何优化空间开销如何不用哈希映射并且只用一个变量 node 表示状态实现这个功能呢
我们可以用一种巧妙的方法修改广度优先搜索
首先根节点入队当队列不为空时 求当前队列的长度 s i s_i si依次从队列中取 s i s_i si个元素进行拓展然后进入下一次迭代
它和普通广度优先搜索的区别在于普通广度优先搜索每次只取一个元素拓展而这里每次取 s i s_i si个元素
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val val;* this.left left;* this.right right;* }* }*/
class Solution {public ListListInteger levelOrder(TreeNode root) {ListListInteger ans new ArrayListListInteger();if(root null){return ans;} //队列是先进先出QueueTreeNode queue new LinkedListTreeNode();queue.offer(root); //队列中添加根节点while(!queue.isEmpty()){ListInteger level new ArrayListInteger();int currentLevelSize queue.size();for(int i 1;icurrentLevelSize;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);}}ans.add(level);}return ans;}
}