1. Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
  2.  
  3. For example:
  4. Given binary tree {3,9,20,#,#,15,7},
  5. 3
  6. / \
  7. 9 20
  8. / \
  9. 15 7
  10. return its level order traversal as:
  11. [
  12. [3],
  13. [9,20],
  14. [15,7]
  15. ]

Best approach:

  1. class Solution {
  2. public List<List<Integer>> levelOrder(TreeNode root) {
  3. List<List<Integer>> res = new ArrayList<> ();
  4. if (root == null) return res;
  5. Queue<TreeNode> queue = new LinkedList<TreeNode>();
  6. queue.offer(root);
  7. while (!queue.isEmpty()) {
  8. int size = queue.size();
  9. List<Integer> row = new ArrayList<>();
  10. for (int i = 0; i < size; i ++) {
  11. TreeNode node = queue.poll();
  12. row.add(node.val);
  13. if (node.left != null) {
  14. queue.offer(node.left);
  15. }
  16. if (node.right != null) {
  17. queue.offer(node.right);
  18. }
  19. }
  20. res.add(row);
  21. }
  22. return res;
  23. }
  24. }

把树看成一个有向图,进行BFS。BST的通常做法都是维护一个队列。这道题的难度在于,如何在队列不断的入队出队操作中,确定哪些node是一个层次的。想了很久没什么好办法,参考了网上的做法,发现他在维护两个数:一个是父节点所在层次的节点在当前队列中的数目ParentNumInQ,另一个是子节点所在层次的节点在当前队列中的数目ChildNumInQ。初始数值为1和0. 每次父节点出队,ParentNumInQ--,每次子节点入队,ParentNumInQ++。一旦ParentNumInQ减至0,说明当前父节点层次已全部出队,全部被存入LinkedList中,这就得到了一层的所有节点。接下来需要一些更新,ParentNumInQ = ChildNumInQ, ChildNumInQ = 0开始考虑下一层。

  1. /**
  2. * Definition for binary tree
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. public class Solution {
  11. public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
  12. ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>> ();
  13. if (root == null) return lists;
  14. LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
  15. queue.add(root);
  16. int ParentNumInQ = 1;
  17. int ChildNumInQ = 0;
  18. ArrayList<Integer> list = new ArrayList<Integer>();
  19. while (!queue.isEmpty()) {
  20. TreeNode cur = queue.poll();
  21. list.add(cur.val);
  22. ParentNumInQ--;
  23. if (cur.left != null) {
  24. queue.add(cur.left);
  25. ChildNumInQ++;
  26. }
  27. if (cur.right != null) {
  28. queue.add(cur.right);
  29. ChildNumInQ++;
  30. }
  31. if (ParentNumInQ == 0) {
  32. ParentNumInQ = ChildNumInQ;
  33. ChildNumInQ = 0;
  34. lists.add(list);
  35. list = new ArrayList<Integer>();
  36. }
  37. }
  38. return lists;
  39. }
  40. }

Leetcode: Binary Tree Level Order Transversal的更多相关文章

  1. Leetcode: Binary Tree Level Order Transversal II

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  2. LeetCode:Binary Tree Level Order Traversal I II

    LeetCode:Binary Tree Level Order Traversal Given a binary tree, return the level order traversal of ...

  3. [LeetCode] Binary Tree Level Order Traversal II 二叉树层序遍历之二

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  4. [LeetCode] Binary Tree Level Order Traversal 二叉树层序遍历

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  5. [leetcode]Binary Tree Level Order Traversal II @ Python

    原题地址:http://oj.leetcode.com/problems/binary-tree-level-order-traversal-ii/ 题意: Given a binary tree, ...

  6. LeetCode: Binary Tree Level Order Traversal 解题报告

    Binary Tree Level Order Traversal Given a binary tree, return the level order traversal of its nodes ...

  7. [Leetcode] Binary tree level order traversal ii二叉树层次遍历

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  8. [LeetCode] Binary Tree Level Order Traversal 与 Binary Tree Zigzag Level Order Traversal,两种按层次遍历树的方式,分别两个队列,两个栈实现

    Binary Tree Level Order Traversal Given a binary tree, return the level order traversal of its nodes ...

  9. LeetCode——Binary Tree Level Order Traversal II

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

随机推荐

  1. 配置Mac漂亮的Shell--Iterm2+OhMyZSH+Agnoster

    安装包管理器 首先当然是解决包管理的问题,Mac下面是Homebrew的天下了 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubuserco ...

  2. vue生成路由实例

    一.vue路由https://router.vuejs.org/zh-cn/1.bower下载vue-routervue的里的链接 <router-link to="/home&quo ...

  3. webconfig的配置说明

    转自 :http://www.cnblogs.com/kissdodog/archive/2013/04/16/3025315.html <?xml version="1.0" ...

  4. MapReduce实例(数据去重)

    数据去重: 原理(理解):Mapreduce程序首先应该确认<k3,v3>,根据<k3,v3>确定<k2,v2>,原始数据中出现次数超过一次的数据在输出文件中只出现 ...

  5. 计蒜客 31460 - Ryuji doesn't want to study - [线段树][2018ICPC徐州网络预赛H题]

    题目链接:https://nanti.jisuanke.com/t/31460 Ryuji is not a good student, and he doesn't want to study. B ...

  6. 【紫书】BigInteger 高精度类型 原书上有一个bug:A+B!=B+A

    存个代码 struct BigInterger { static const int BASE = 1e8; ; vector<int> s; BigInterger() { *this ...

  7. ubuntu 添加用户到已存在的组

    sudo adduser 用户名 组名   sudo minicom –s 配置 minicom访问ttyUSB0没权限,发现属于dialout 组 james@james-OptiPlex-380: ...

  8. os.stat(filename).st_size 文件信息

    os.path.getsize(i) py36\Lib\genericpath.py def getsize(filename): """Return the size ...

  9. JavaScript如何实现拖放功能

    1.在学习ExtJs时,对其拖放功能感到很陌生,然后找了个拖放功能实现. 转载地址 2.拖拽的基本原理就是根据鼠标的移动来移动被拖拽的元素.鼠标的移动也就是x.y坐标的变化:元素的移动就是style. ...

  10. python string 模块

    标准库 python3 python2.7 都可以用 sting.ascii_letters是生成所有字母,从a-z和A-Z, string.digits是生成所有数字0-9. import stri ...