標籤:二叉樹 遍曆 演算法 面試 java
【103-Binary Tree Zigzag Level Order Traversal(二叉樹分層Z字形遍曆)】
【LeetCode-面試演算法經典-Java實現】【所有題目目錄索引】
原題
Given a binary tree, return the zigzag level order traversal of its nodes’ values. (ie, from left to right, then right to left for the next level and alternate between).
For example:
Given binary tree {3,9,20,#,#,15,7},
3 / 9 20 / 15 7
return its zigzag level order traversal as:
[ [3], [20,9], [15,7]]
題目大意
給定一棵二叉樹,從頂向下,進行Z字形分層遍曆,即:如果本層是從左向右的,下層就是從右向左。
解題思路
二叉樹分層遍曆進行改進,使用兩個棧來進行。
代碼實現
樹結點類
public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; }}
演算法實作類別
import java.util.Deque;import java.util.LinkedList;import java.util.List;/** * Author: 王俊超 * Date: 2015-06-23 * Time: 13:24 * Declaration: All Rights Reserved !!! */public class Solution { public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> result = new LinkedList<>(); if (root == null) { return result; } // 遍曆標誌,0表示從左至右,1表示從右至左 int flag = 0; TreeNode node; // 記錄每一層的元素 List<Integer> lay = new LinkedList<>(); // 雙向隊列,當作棧來使用,記錄當前層待處理結點 Deque<TreeNode> stack = new LinkedList<>(); // 記錄下一層待處理結點 Deque<TreeNode> nextStack = new LinkedList<>(); stack.add(root); while (!stack.isEmpty()) { // 刪除棧頂元素 node = stack.removeLast(); // 結果入隊 lay.add(node.val); // 如果當前是從左至右遍曆,按左子樹右子樹的順序添加 if (flag == 0) { if (node.left != null) { nextStack.addLast(node.left); } if (node.right != null) { nextStack.addLast(node.right); } } // 如果當前是從右至左遍曆,按右子樹左子樹的順序添加 else { if (node.right != null) { nextStack.addLast(node.right); } if (node.left != null) { nextStack.addLast(node.left); } } // 當前層已經處理完了 if (stack.isEmpty()) { Deque<TreeNode> temp = nextStack; nextStack = stack; stack = temp; // 標記下一層處理的方向 flag = 1 - flag; // 儲存本層結果 result.add(lay); // 建立新的鏈表處理下一層的結果 lay = new LinkedList<>(); } } return result; }}
評測結果
點擊圖片,滑鼠不釋放,拖動一段位置,釋放後在新的視窗中查看完整圖片。
特別說明
歡迎轉載,轉載請註明出處【http://blog.csdn.net/derrantcm/article/details/47354341】
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
【LeetCode-面試演算法經典-Java實現】【103-Binary Tree Zigzag Level Order Traversal(二叉樹分層Z字形遍曆)】