1. 程式人生 > >[leetcode-二叉樹層次遍歷並統計每層節點數]--102. Binary Tree Level Order Traversal

[leetcode-二叉樹層次遍歷並統計每層節點數]--102. Binary Tree Level Order Traversal

Question 102. 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,null,null,15,7],

    3
   / \
  9  20
     / \
    15  7

return its level order traversal as:

[
  [3],
  [9,20],
  [15,7]
]

二叉樹的層次遍歷並統計每層結點的數量

解決: 這裡使用FIFO佇列來實現,對於統計每層結點的統計,根據層次遍歷時佇列的特性可以直接獲取並存入佇列。

實現原始碼如下:

/**
 * 二叉樹的層次遍歷
 * 使用佇列實現
 * @param root
 * @return
 */
public static List<List<Integer>> levelOrder(TreeNode root) {
    Queue<TreeNode> queue = new LinkedList<TreeNode>();//佇列裡面存放結點
List<List<Integer>> result = new ArrayList<List<Integer>>(); //如果為空樹就直接返回 if(root == null){ return result; } queue.offer(root);//根節點先入隊 //只要佇列非空就一直迴圈; while (!queue.isEmpty()){ int levelNum = queue.size();//獲取當前層的節點數. List<Integer> subList = new
ArrayList<>(); //遍歷當前層結點 for(int i=0; i<levelNum; i++){ //隊首出隊並將value加入子list TreeNode node = queue.poll(); subList.add(node.val); //將非空左右子樹加入queue if(node.left != null){//如果隊首的左結點不為空就把左結點入隊 queue.offer(node.left); } if(node.right != null){//如果隊首的右結點不為空就把右結點入隊 queue.offer(node.right); } } result.add(subList);//新增一層 } return result; }

測試用例:

public static void main(String[] args) {
    TreeNode root = new TreeNode(3);
    root.left = new TreeNode(9);
    root.right = new TreeNode(20);
    root.right.left = new TreeNode(15);
    root.right.right = new TreeNode(7);

    List<List<Integer>> res = Question102.levelOrder(root);

    for(List<Integer> is : res){
        for(Integer i : is){
            System.out.print(i + ", ");
        }
        System.out.println();
    }
}

執行結果:

3, 
9, 20, 
15, 7,