Question:
二叉樹的鋸齒遍歷
給出一棵二叉樹,返回其節點值的鋸齒形層次遍歷(先從左往右,下一層再從右往左,層與層之間交替進行)
給出一棵二叉樹 {3,9,20,#,#,15,7},
3
/ \
9 20
/ \
15 7
返回其鋸齒形的層次遍歷爲:
[
[3],
[20,9],
[15,7]
]
Solution:
鋸齒遍歷本質上還是廣度優先搜索,每一層按照從左到右的順序進行遍歷需要用到隊列
還是藉助隊列按照每一層從左到右的順序進行遍歷,只不過需要維護一個每一層是正序還是倒序的標誌
至於向list中倒序添加只需執行list.add(0,element)即可
這裏參考:http://www.cnblogs.com/jasminemzy/p/7712971.html 摩拜一下大神
步驟:
1、初始化隊列及方向標誌,並將root入隊
2、隊列不爲空,執行如下操作
3、記錄隊列中當前元素的個數size,避免彈多了,入隊的格式就是這一層所有節點的個數
4、出隊size個元素,左右兒子入隊,按方向性及出隊順序添加到結果集中
5、方向置反
public class Q71_binaryTreeZigzagLevelOrderTraversal {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
// write your code here
List<List<Integer>> result = new ArrayList<List<Integer>>();
if(root == null)
return result;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
//正反向標誌
boolean isForward = true;
queue.offer(root);
while(!queue.isEmpty()) {
//由於下面還要向queue裏面添加節點,這個size就是上一層的節點總數
int size = queue.size();
List<Integer> subList = new ArrayList<Integer>();
for(int i = 0 ; i < size ; i++) {
TreeNode current = queue.poll();
if(isForward)
subList.add(current.val);
else
subList.add(0,current.val);
if(current.left != null)
queue.offer(current.left);
if(current.right != null)
queue.offer(current.right);
}
result.add(subList);
//方向反轉
isForward = !isForward;
}
return result;
}
@Test
public void test() {
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.left.right = new TreeNode(5);
root.left.left = new TreeNode(4);
root.right = new TreeNode(3);
List<List<Integer>> result = zigzagLevelOrder(root);
System.out.println(result.toString());
}
}