[leetcode-二叉樹層次遍歷並統計每層節點數]--102. Binary Tree Level Order Traversal
阿新 • • 發佈:2019-01-22
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,