在普通的层序遍历中需要一个数据结构队列,在层序遍历时从队列头部取出节点,并将其子女追加到队列的末尾,这种遍历方式并不能体现出层次关系(当前层未遍历的节点与当前层已遍历的节点的子女在同一个队列中),有时候在进行层序遍历时需要明确层次,这个时候可以设置两个队列,一个父层队列,一个子女队列,父层队列遍历完之后,将子女队列设置为父层队列,并将子女队列清空。
在leetcode中,有两个题可以用此方法轻松解决,分别为:
Populating Next Right Pointers in Each Node II ,地址为:https://leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/
Binary Tree Zigzag Level Order Traversal,地址为:https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/
其中第二个题目的代码如下:
public class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
List<TreeNode> list1 = new ArrayList<TreeNode>();//list1是父层节点,list2是子女层节点
List<TreeNode> list2 = new ArrayList<TreeNode>();
if(root==null){
return res;
}
list1.add(root);
boolean left2right = true;
while(list1.size()!=0){ //利用list1来产生list2s
ArrayList<Integer> level = new ArrayList<Integer>();
if(left2right){
for(int i=0;i<list1.size();i++){
level.add(list1.get(i).val);
}
}else{
for(int i=list1.size()-1;i>=0;i--){
level.add(list1.get(i).val);
}
}
res.add(level);
left2right = !left2right;
for(int i=0;i<list1.size();i++){
if(list1.get(i).left!=null){
list2.add(list1.get(i).left);
}
if(list1.get(i).right!=null){
list2.add(list1.get(i).right);
}
}
list1.clear();
list1 = new ArrayList<TreeNode>(list2);
list2.clear();
}
return res;
}
}