003-102-Binary Tree Level Order Traversal 层序遍历二叉树
来源:互联网 发布:js array 添加数据 编辑:程序博客网 时间:2024/05/18 13:48
- Description
- 分析 使用BFS
- code
- 尾递归
- 迭代
- 只使用一个队列的代码
- DFS 的思路
Description
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).For example:Given binary tree [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7return its level order traversal as:[ [3], [9,20], [15,7]]
分析 使用BFS
树的层序遍历很简单,树可以看成图的退化,对树的广度优先遍历就是层序遍历,我们用一个队列就可以完成。每访问一个节点,执行队列的出队操作,同时把他的子节点插入到队列末尾,持续访问直至队列为空。当要将每一层区别开来的时候好似麻烦一点,其实也简单,我们可以从根节点开始访问,根节点作为特殊的一层,只有一个节点。每访问一层就为该层的子节点,也就是就为下一层的节点新建立一个队列。
code
尾递归
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */public class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> opList=new ArrayList<List<Integer>>(); Queue<TreeNode> queue=new LinkedList<TreeNode>(); if(root!=null){ queue.offer(root); levelOrder(opList,queue); } return opList; } public void levelOrder(List<List<Integer>> opList, Queue<TreeNode> queue){ if(queue.isEmpty())return; else{ List<Integer> list=new ArrayList<Integer>();//存放一层的节点的值 Queue<TreeNode> nextLevelQueue=new LinkedList<TreeNode>();//用以存放下一层的节点 while(!queue.isEmpty()){//访问一层的队列 TreeNode next=queue.poll(); list.add(next.val); if(next.left!=null)nextLevelQueue.offer(next.left); if(next.right!=null)nextLevelQueue.offer(next.right); } opList.add(list);//插入到输出 levelOrder(opList,nextLevelQueue);//尾递归,消耗很大,转迭代 } }}
用时4毫秒,可以看到我使用的是尾递归,可以将其改为迭代方式,减少不必要的开销。可以看到,每访问一层,就创建一个节点队列以用于存放下一层的节点。
迭代
public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> opList=new ArrayList<List<Integer>>(); Queue<TreeNode> queue=new LinkedList<TreeNode>(); if(root!=null){ queue.offer(root); //levelOrder(opList,queue); while(!queue.isEmpty()){ List<Integer> list=new ArrayList<Integer>(); Queue<TreeNode> nextLevelQueue=new LinkedList<TreeNode>(); while(!queue.isEmpty()){//访问一层的节点 TreeNode next=queue.poll(); list.add(next.val); if(next.left!=null)nextLevelQueue.offer(next.left); if(next.right!=null)nextLevelQueue.offer(next.right); }//while opList.add(list); queue=nextLevelQueue;//访问下一层 }//while } return opList; }
用时3毫秒。可以看到,在运行期间为每一层都创建一个新的队列。是否可以改为只使用一个队列?如果可以知道该层的节点数量k,就可以从队列中取出层的该k个节点,也可继续将下一层的节点插入该队列。可以在每层遍历前获得队列的大小,就获得了该层的节点数k。
只使用一个队列的代码
public class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> opList=new ArrayList<List<Integer>>(); Queue<TreeNode> queue=new LinkedList<TreeNode>(); if(root!=null){ queue.offer(root); //levelOrder(opList,queue); while(!queue.isEmpty()){ List<Integer> list=new ArrayList<Integer>(); int levelSize=queue.size(); for(int i=0;i<levelSize;i++){ TreeNode next=queue.poll(); list.add(next.val); if(next.left!=null)queue.offer(next.left); if(next.right!=null)queue.offer(next.right); }//while opList.add(list); }//while } return opList; }}
DFS 的思路
在讨论区看到有buddy用DFS的思路,很强。ac后可以自行前往评论区看看。
0 0
- 003-102-Binary Tree Level Order Traversal 层序遍历二叉树
- 【LeetCode】Binary Tree Zigzag Level Order Traversal--- 层序遍历二叉树
- Binary Tree Level Order Traversal 二叉树的层序遍历
- Binary Tree Level Order Traversal II 二叉树的反向层序遍历
- 二叉树的层序遍历 改进版 Binary Tree Level Order Traversal II
- Binary Tree Level Order Traversal 二叉树的层序遍历
- 004-107-Binary Tree Level Order Traversal II 层序遍历二叉树之二
- Binary Tree Zigzag Level Order Traversal,bfs,层序遍历
- 【leetcode 层序遍历】Binary Tree Level Order Traversal
- 【leetcode 层序遍历】Binary Tree Level Order Traversal II
- 【leetcode 层序遍历】Binary Tree Zigzag Level Order Traversal
- 【LeetCode】Binary Tree Level Order Traversal(层序遍历)
- Binary Tree Level Order Traversal II 从下向上按层遍历二叉树
- 102. Binary Tree Level Order Traversal (二叉树层次遍历 输出每层)
- Binary Tree Level Order Traversal 二叉树的同层遍历
- Binary Tree Level Order Traversal II 二叉树的同层遍历系列2
- Binary Tree Level Order Traversal:层次遍历二叉树,并返回每层的数值
- Binary Tree Level Order Traversal 分层遍历二叉树@LeetCode
- log4j.properties详解与例子 转载自新浪博主-susaml
- dll封装类的析构函数
- 深入浅出JMS(四)--Spring和ActiveMQ整合的完整实例
- 判断二叉树是否对称
- 逆序输出正整数
- 003-102-Binary Tree Level Order Traversal 层序遍历二叉树
- 一次循环查找字符串中第一个不重复的字节
- 计算机网络复习(第一章 概述)
- 线索二叉树
- webApp,在androidstudio上离线打包问题
- Eclipse如何快速修改工程名及包名
- steghide中文演示教程
- POJ 3254 Corn Fields 状压dp
- 背景分割