給定一個二叉樹,返回該二叉樹的之字形層序遍歷,(第一層從左向右,下一層從右向左,一直這樣交替)
例如:
給定的二叉樹是{3,9,20,#,#,15,7},
該二叉樹之字形層序遍歷的結果是
[
[3],
[20,9],
[15,7]
]
代碼實現
通過使用兩個棧來實現之字形遍歷,第一個棧存儲從左到右的遍歷的層,第二個棧存儲從右到左遍歷的層。其中第一個棧出棧的元素,再將其直系子節點存儲棧中時,先存左孩子再存右孩子,這樣它們的孩子那一層的元素出棧的時候就是從右到左了;第二個棧中的元素出棧的時候,存儲它們的孩子節點的時候,先存右孩子,再存左孩子,這樣就保證了它們的孩子層的元素出棧的時候是從左往右了。
這兩個棧中每次只存儲一層的元素,將一層的元素全部出棧完畢之后,才會對下一層的元素進行出棧,這就保證能讓同一層的元素存儲到一個列表中了。
public ArrayList<ArrayList<Integer>> zigzagLevelOrder (TreeNode root) {
ArrayList<ArrayList<Integer>> resList = new ArrayList<>();
if (root == null){
return resList;
}
Stack<TreeNode> first = new Stack<>(); //從左往右
Stack<TreeNode> second = new Stack<>(); //從右往左
first.push(root);
int i = 1;
while (!first.isEmpty() || !second.isEmpty()){
ArrayList<Integer> level = new ArrayList<>();
if (i % 2 != 0){
while (!first.isEmpty()){
TreeNode node = first.pop();
level.add(node.val);
if (node.left != null){
second.push(node.left);
}
if (node.right != null){
second.push(node.right);
}
}
}else {
while (!second.isEmpty()){
TreeNode node = second.pop();
level.add(node.val);
if (node.right!=null){
first.push(node.right);
}
if (node.left != null){
first.push(node.left);
}
}
}
i++;
resList.add(level);
}
return resList;
}