给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问全部节点)。html
例如:
给定二叉树: [3,9,20,null,null,15,7],java
3 / \ 9 20 / \ 15 7
返回其层次遍历结果:node
[ [3], [9,20], [15,7] ]
来源:力扣(LeetCode)
连接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal
著做权归领扣网络全部。商业转载请联系官方受权,非商业转载请注明出处。web
有两种通用的遍历树的策略:算法
下图中的顶点按照访问的顺序编号,按照 1-2-3-4-5 的顺序来比较不一样的策略。数组
本问题就是用宽度优先搜索遍从来划分层次:[[1], [2, 3], [4, 5]]。安全
最简单的解法就是递归,首先确认树非空,而后调用递归函数 helper(node, level),参数是当前节点和节点的层次。程序过程以下:网络
class Solution { List<List<Integer>> levels = new ArrayList<List<Integer>>(); public void helper(TreeNode node, int level) { // start the current level if (levels.size() == level) levels.add(new ArrayList<Integer>()); // fulfil the current level levels.get(level).add(node.val); // process child nodes for the next level if (node.left != null) helper(node.left, level + 1); if (node.right != null) helper(node.right, level + 1); } public List<List<Integer>> levelOrder(TreeNode root) { if (root == null) return levels; helper(root, 0); return levels; } }
时间复杂度:
,由于每一个节点刚好会被运算一次。
空间复杂度:
,保存输出结果的数组包含 N 个节点的值。多线程
上面的递归方法也能够写成迭代的形式。app
咱们将树上顶点按照层次依次放入队列结构中,队列中元素知足 FIFO(先进先出)的原则。在 Java 中可使用 Queue 接口中的 LinkedList实现。在 Python 中若是使用 Queue 结构,但由于它是为多线程之间安全交换而设计的,因此使用了锁,会致使性能不佳。所以在 Python 中可使用 deque 的 append() 和 popleft() 函数来快速实现队列的功能。
第 0 层只包含根节点 root ,算法实现以下:
class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> levels = new ArrayList<List<Integer>>(); if (root == null) return levels; Queue<TreeNode> queue = new LinkedList<TreeNode>(); queue.add(root); int level = 0; while ( !queue.isEmpty() ) { // start the current level levels.add(new ArrayList<Integer>()); // number of elements in the current level int level_length = queue.size(); for(int i = 0; i < level_length; ++i) { TreeNode node = queue.remove(); // fulfill the current level levels.get(level).add(node.val); // add child nodes of the current level // in the queue for the next level if (node.left != null) queue.add(node.left); if (node.right != null) queue.add(node.right); } // go to next level level++; } return levels; } }
时间复杂度:
,由于每一个节点刚好会被运算一次。
空间复杂度:
,保存输出结果的数组包含 N 个节点的值。
做者:LeetCode
连接:https://leetcode-cn.com/problems/two-sum/solution/er-cha-shu-de-ceng-ci-bian-li-by-leetcode/
来源:力扣(LeetCode)
著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。
100和101题代码继续改改就用……
执行用时 :2 ms, 在全部 Java 提交中击败了90.87%的用户
内存消耗 :35.9 MB, 在全部 Java 提交中击败了68.36%的用户
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> res = new LinkedList<>(); if(root==null) return res; LinkedList<TreeNode> queue = new LinkedList<>(); queue.add(root); TreeNode nextFirst = null; TreeNode temp = null; List<Integer> list = new LinkedList<>(); while(!queue.isEmpty()){ temp = queue.poll(); if(temp==nextFirst) { nextFirst=null; res.add(list); list = new LinkedList<>(); } list.add(temp.val); if(temp.left!=null){ queue.add(temp.left); if(nextFirst==null) nextFirst = temp.left; } if(temp.right!=null){ queue.add(temp.right); if(nextFirst==null) nextFirst = temp.right; } } if(list.size()>0) res.add(list); return res; } }