leetcode 之Binary Tree Level Order Traversal I和II 解題思路
阿新 • • 發佈:2019-01-06
題目如下:
Binary Tree Level Order Traversal I
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] ]
層次遍歷的時候需要藉助輔助資料結構--佇列。每一層用null節點區分一下。當刪除佇列的頭節點時,需要判斷當前節點是否為null,如果為null,說明該層已經結束,需要新建一個arraylist,同時需要再佇列尾部新增null,用來區分下一層。但是需要注意的是,如果當前null為最後一個節點時,就不需要再在尾部新增null了,否則就會陷入死迴圈了。
程式碼如下:
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> list = new ArrayList<List<Integer>>(); if(root == null) return list; LinkedList<TreeNode> queue = new LinkedList<TreeNode>(); queue.add(root); queue.add(null); List<Integer> sublist = new ArrayList<Integer>(); while(queue.size() > 0){ TreeNode node = queue.remove(); if(node != null){ sublist.add(node.val); if(node.left != null) queue.add(node.left); if(node.right != null) queue.add(node.right); }else{ list.add(sublist); if(queue.size() > 0){ sublist = new ArrayList<Integer>(); queue.add(null); } } } return list; } }
Binary Tree Level Order Traversal II
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).
For example:
Given binary tree {3,9,20,#,#,15,7}
,
3 / \ 9 20 / \ 15 7
return its bottom-up level order traversal as:
[ [15,7], [9,20], [3] ]解法與I相同,只不過將最後結果翻轉一下即可。這裡的做法是,採用頭插法。
程式碼如下:
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
if(root == null) return list;
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
queue.add(null);
List<Integer> sublist = new ArrayList<Integer>();
while(queue.size() > 0){
TreeNode node = queue.remove();
if(node != null){
sublist.add(node.val);
if(node.left != null) queue.add(node.left);
if(node.right != null) queue.add(node.right);
}else{
list.add(0,sublist);//和I相比只有這裡不同
if(queue.size() > 0){
sublist = new ArrayList<Integer>();
queue.add(null);
}
}
}
return list;
}
}