從物理學到計算機,再到硬件,再到人工智能!
藍橋杯備賽 (LintCode上刷的第17題)
問題描述
給出一棵二叉樹,返回其節點值的鋸齒形層次遍歷(先從左往右,下一層再從右往左,層與層之間交替進行)
樣例輸出
JAVA代碼實現
package tree;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class ZigzagLevelOrder1230 {
/**
* Z字型打印二叉樹:先從左往右,下一層再從右往左,層與層之間交替進行
* @param root the root of the binary tree
* @return Z字型的數列
*/
public List<List<Integer>> zigzagLevelOrder(TreeNode1230 root) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if (root == null) {
return result;
}
Stack<TreeNode1230> currLevel = new Stack<>();
Stack<TreeNode1230> nextLevel = new Stack<>();
Stack<TreeNode1230> tmp;
//當前這一層放進根節點
currLevel.push(root);
//記錄遍歷順序
boolean normalOrder = true;
while (!currLevel.isEmpty()) {
ArrayList<Integer> currLevelResult = new ArrayList<>();
while (!currLevel.isEmpty()) {
TreeNode1230 node = currLevel.pop();
//添加根節點
currLevelResult.add(node.val);
//開始每一層遍歷
if (normalOrder) {
if (node.left != null) {
nextLevel.push(node.left);
}
if (node.right != null) {
nextLevel.push(node.right);
}
} else {
if (node.right != null) {
nextLevel.push(node.right);
}
if (node.left != null) {
nextLevel.push(node.left);
}
}
}
result.add(currLevelResult);
//當前層下移
tmp = currLevel;
currLevel = nextLevel;
nextLevel = tmp;
//改變順序
normalOrder = !normalOrder;
}
return result;
}
}