zoukankan      html  css  js  c++  java
  • Leetcode: Binary Tree Level Order Traversal

    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,#,#,15,7},
        3
       / 
      9  20
        /  
       15   7
    return its level order traversal as:
    [
      [3],
      [9,20],
      [15,7]
    ]

    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 }
  • 相关阅读:
    百度统计图标消失了?
    C#中的变量类型var
    弗恩15693桌面读写器在win8下的测试
    JSON格式标准:http://www.ietf.org/rfc/rfc4627.txt?number=4627
    PHP中文乱码(转自百度文库)(记住:不管怎么样,用navicat创建数据库时选择utf8编码.)
    html2pdf:生成pdf应用
    win2003系统下apache、php、mysql安装以及虚拟主机和目录权限设置(转载)
    (转载)java环境变量配置
    (转)smarty里使用php函数
    (转载)php 知道某年中第几天计算出日期年月日
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/3972609.html
Copyright © 2011-2022 走看看