71. 二叉樹的鋸齒形層次遍歷

從物理學到計算機,再到硬件,再到人工智能!
藍橋杯備賽 (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;
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章