【leetcode】Binary Tree Zigzag Level Order Traversal

來源:互聯網
上載者:User

標籤:des   style   blog   http   java   color   

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]]

題解:首先設定一個變數zigZag表示在遍曆下一層的時候,是否需要逆序,zigZag為true,表示下一層需要逆序,否則下一層不需要逆序。如果不需要逆序,那麼在產生nextLevel的時候,先把這層節點的右子入棧,再把左子入棧;如果下一層需要逆序,先把這層節點的左子入棧,再把右子入棧。

比如最初zigZag = true(第二層需要逆序),在遍曆第一層(根節點3)的時候,先把左子9入棧,再把右子20入棧,那麼最後出棧時候得到的第二層遍曆序列為[20,9];然後zigZag=false(第三層不需要逆序),在遍曆第二層的時候,先遍曆20,將20右子入棧,然後將20的右子7放入nextLevel,再把左子15放入nextLevel,那麼第三層出棧時實際得到[15,7]。

在這裡有一點要注意,為什麼不需要逆序的時候仍然需要用到棧呢?因為雖然當前層不需要逆序,但是當前層的上一層遍曆的時候是逆序遍曆的,所以仍然需要藉助棧。比如如果我們把上述的樹添加一個節點變成如所示的樹:

    3   /   9  20 /  /  4  15   7

遍曆第三層應該得到[4,15,7],但是遍曆第二層的順序是20,9,所以20的孩子們還是要壓到棧底,才能保證它們彈出來的時候在9的左子4的後面。

代碼如下:

 1 /** 2  * Definition for binary tree 3  * public class TreeNode { 4  *     int val; 5  *     TreeNode left; 6  *     TreeNode right; 7  *     TreeNode(int x) { val = x; } 8  * } 9  */10 public class Solution {11     public List<List<Integer>> zigzagLevelOrder(TreeNode root) {12         List<List<Integer>> answer = new ArrayList<List<Integer>>();13         if(root == null)14             return answer;15         16         Stack<TreeNode> currLevel = new Stack<TreeNode>();17         Stack<TreeNode> nextLevel = new Stack<TreeNode>();18         boolean zigZag = true;19         20         currLevel.push(root);21         while(!currLevel.isEmpty()){22             ArrayList<Integer> result = new ArrayList<Integer>();23             24             while(!currLevel.isEmpty()){25                 TreeNode node = currLevel.pop();26                 result.add(node.val);27                 28                 if(!zigZag){29                     if(node.right != null)30                         nextLevel.push(node.right);31                     if(node.left != null)32                         nextLevel.push(node.left);33                 }34                 else {35                     if(node.left != null)36                         nextLevel.push(node.left);37                     if(node.right != null)38                         nextLevel.push(node.right);39                 }40             }41             42             zigZag = !zigZag;43             List<Integer> temp = new ArrayList<Integer>(result);44             answer.add(temp);45             result.clear();46             Stack<TreeNode> tmp = new Stack<TreeNode>();47             tmp.addAll(nextLevel);48             currLevel = tmp;49             nextLevel.clear();50         }51         return answer;52     }53 }

上述代碼中46行的棧tmp是用來儲存nextLevel棧的空間的,否則雖然把nextLevel棧賦值給currLevel了,但是當nextLevel清空的時候,這部分記憶體也會被清空,所以要把nextLevel中的元素放置到另一塊記憶體裡面。

棧的建構函式中不能直接把棧初始化成為另外一個棧,關於把一個棧賦值給另外一個棧的方法有很多,可以參見這裡:http://stackoverflow.com/questions/7919836/how-do-i-copy-a-stack-in-java

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.