[LintCode] Binary Tree Level Order Traversal(二叉树的层次遍历)

描述

给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问)

样例

给一棵二叉树{3,9,20,#,#,15,7}:

  3

/ \

9  20

  /  \

15  7

返回他的分层遍历结果:

[

  [3],

  [9,20],

  [15,7]

]

挑战

挑战1:只使用一个队列去实现它

挑战2:用BFS算法来做

代码

GitHub 的源代码,请访问下面的链接:

https://github.com/cwiki-us/java-tutorial/blob/master/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0069LevelOrderTest.java


package com.ossez.lang.tutorial.tests.lintcode;

import java.util.ArrayList;

import java.util.LinkedList;

import java.util.List;

import java.util.Queue;

import org.junit.Test;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import com.ossez.lang.tutorial.models.TreeNode;

/**

* <p>

* 69

* <ul>

* <li>@see <a href=

* "https://www.cwiki.us/display/ITCLASSIFICATION/Binary+Tree+Level+Order+Traversal">https://www.cwiki.us/display/ITCLASSIFICATION/Binary+Tree+Level+Order+Traversal</a>

* <li>@see<a href=

* "https://www.lintcode.com/problem/binary-tree-level-order-traversal">https://www.lintcode.com/problem/binary-tree-level-order-traversal</a>

* </ul>

* </p>

*

* @author YuCheng

*

*/

public class LintCode0069LevelOrderTest {

  private final static Logger logger = LoggerFactory.getLogger(LintCode0069LevelOrderTest.class);

  /**

  *

  */

  @Test

  public void testMain() {

    logger.debug("BEGIN");

    String data = "{3,9,20,#,#,15,7}";

    TreeNode tn = deserialize(data);

    System.out.println(levelOrder(tn));

  }

  /**

  * Deserialize from array to tree

  *

  * @param data

  * @return

  */

  private TreeNode deserialize(String data) {

    // NULL CHECK

    if (data.equals("{}")) {

      return null;

    }

    ArrayList<TreeNode> treeList = new ArrayList<TreeNode>();

    data = data.replace("{", "");

    data = data.replace("}", "");

    String[] vals = data.split(",");

    // INSERT ROOT

    TreeNode root = new TreeNode(Integer.parseInt(vals[0]));

    treeList.add(root);

    int index = 0;

    boolean isLeftChild = true;

    for (int i = 1; i < vals.length; i++) {

      if (!vals[i].equals("#")) {

        TreeNode node = new TreeNode(Integer.parseInt(vals[i]));

        if (isLeftChild) {

          treeList.get(index).left = node;

        } else {

          treeList.get(index).right = node;

        }

        treeList.add(node);

      }

      // LEVEL

      if (!isLeftChild) {

        index++;

      }

      // MOVE TO RIGHT OR NEXT LEVEL

      isLeftChild = !isLeftChild;

    }

    return root;

  }

  private List<List<Integer>> levelOrder(TreeNode root) {

    Queue<TreeNode> queue = new LinkedList<TreeNode>();

    List<List<Integer>> rs = new ArrayList<List<Integer>>();

    // NULL CHECK

    if (root == null) {

      return rs;

    }

    queue.offer(root);

    while (!queue.isEmpty()) {

      int length = queue.size();

      List<Integer> list = new ArrayList<Integer>();

      for (int i = 0; i < length; i++) {

        TreeNode curTN = queue.poll();

        list.add(curTN.val);

        if (curTN.left != null) {

          queue.offer(curTN.left);

        }

        if (curTN.right != null) {

          queue.offer(curTN.right);

        }

      }

      rs.add(list);

    }

    return rs;

  }

}




点评

这个程序可以使用队列的广度优先算法来进行遍历。

需要注意的是,因为在输出结果的时候需要按照层级来进行输出,那么需要考虑的一个算法就是二叉树的层级遍历算法。

这个算法要求在遍历的时候记录树的层级。


https://www.cwiki.us/display/ITCLASSIFICATION/Binary+Tree+Level+Order+Traversal

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,775评论 0 33
  • 个人觉得这个算法的思维很妙,需要考虑到几个地方,下面在给出代码之前,先对思想进行一个详细分析: 题目Given a...
    郑明明阅读 259评论 0 1
  • 你和他们也一样,都是带着目的性去付出真心,你只想得到别人的好,各种方面的,不劳而获的。我心里人和人的关系应该是以物...
    失望杂货铺阅读 297评论 0 0
  • 人过中年,某次参加了一个音乐治疗的体验活动,感受到团体里那位极美的带领人叮叮咚咚的一段吉它引导之后,突然有一股力量...
    刘珉珉阅读 506评论 0 0
  • 想…练习瑜伽… 办年卡…花大价钱,遥遥无期,害怕自己不能坚持 办周卡,花小价钱,生命周期为21天,怕看不到效果 前...
    MDyoga阅读 234评论 0 0