原题
102
107
解法
思路分析
与前面很多的题类似,为二叉树的广度优先遍历(BFS),借助一个队列,共N次迭代,N为树的层高,每一次迭代全部第i层的节点出队列,第i+1层的节点进队列,因此每一次可以处理第i层的所有节点的值。
图解(102)
107的图解和102几乎相同,除了oneLevelNodes每次都是增加到AllLevelNodes的最前端;
代码102
由于oneLevelNodes每次都是增加到AllLevelNodes的尾部,所以采用ArrayList;
public class Solution102 {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> allLevelNodes = new ArrayList<List<Integer>>();
List<Integer> oneLevelNode = new ArrayList<Integer>();
Deque<TreeNode> deque = new LinkedList<TreeNode>();
if (root != null)
deque.push(root);
while (!deque.isEmpty()){
int dequeSize = deque.size();
while (dequeSize-- > 0){
TreeNode currentNode =
deque.pop();
oneLevelNode.add(currentNode.val);
if (currentNode.left != null)
deque.addLast(currentNode.left);
if (currentNode.right != null)
deque.addLast(currentNode.right);
}
allLevelNodes.add(new ArrayList<Integer>(oneLevelNode));
oneLevelNode.clear();
}
return allLevelNodes;
}
}
代码107
oneLevelNodes每次都是插入到AllLevelNodes的最前端,所以采用LinkedList
public class Solution107 {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
Deque<List<Integer>> allLevelNodes = new LinkedList<List<Integer>>();
List<Integer> oneLevelNode = new ArrayList<Integer>();
Deque<TreeNode> deque = new LinkedList<TreeNode>();
if (root != null)
deque.push(root);
while (!deque.isEmpty()){
int dequeSize = deque.size();
while (dequeSize-- > 0){
TreeNode currentNode =
deque.pop();
oneLevelNode.add(currentNode.val);
if (currentNode.left != null)
deque.addLast(currentNode.left);
if (currentNode.right != null)
deque.addLast(currentNode.right);
}
allLevelNodes.push(new ArrayList<Integer>(oneLevelNode));
oneLevelNode.clear();
}
return (List<List<Integer>>)allLevelNodes;
}
}
编程时遇到的错误
对List理解的不够深刻,在代码102中往二维List中添加List一开始是使用 allLevelNodes.add(new ArrayList<Integer>(oneLevelNode)); ,这样的话每次添加的都是相同的oneLevelNode这个对象,因此oneLevelNode.clear();之后,allLevelNodes就变为了{[], [], []},应该建立一个新的对象allLevelNodes.add(new ArrayList<Integer>(oneLevelNode));
小demo如下:
public class Main {
public static void main(String[] args) throws UnsupportedEncodingException {
List<List<String>> listList1 = new ArrayList<List<String>>();
List<String> list = new ArrayList<String>();
list.add("1");
listList1.add(list);
System.out.println("第一次:" + listList1);
list.add("2");
listList1.add(list);
System.out.println("第二次:" + listList1);
}
}
输出:
public class Main {
public static void main(String[] args) throws UnsupportedEncodingException {
List<List<String>> listList1 = new ArrayList<List<String>>();
List<String> list = new ArrayList<String>();
list.add("1");
listList1.add(new ArrayList<String>(list));
System.out.println("第一次:" + listList1);
list.add("2");
listList1.add(new ArrayList<String>(list));
System.out.println("第二次:" + listList1);
}
}
输出: