1. 程式人生 > 實用技巧 >牛客題霸NC14二叉樹的之字形層序遍歷Java題解

牛客題霸NC14二叉樹的之字形層序遍歷Java題解

牛客題霸NC14二叉樹的之字形層序遍歷Java題解

https://www.nowcoder.com/practice/47e1687126fa461e8a3aff8632aa5559?tpId=117&&tqId=34935&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking

方法:利用佇列
解題思路:將節點加入到佇列中,利用佇列Queue的先進後出,依此彈出節點。將每次彈出節點的值儲存到一個ArrayList中(tmp),如果當前層是奇數層(從1開始),執行尾插,如果當前層是偶數層,執行頭插。如果彈出的節點有左、右子節點,則將左、右子節點加入到佇列Queue中,每一層遍歷完,將這一層的節點都加入到ArrayList<ArrayList<integer>> list 中。

import java.util.*;
 
/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */
 
public class Solution {
    /**
     *
     * @param root TreeNode類
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> zigzagLevelOrder (TreeNode root) {
        ArrayList
<ArrayList<Integer>> res = new ArrayList<>(); Queue<TreeNode> queue = new LinkedList<>(); if(root!=null){ queue.add(root); } while(!queue.isEmpty()){ ArrayList<Integer> tmp = new ArrayList<>(); //
儲存每一層節點 for(int i= queue.size();i>0;i--){ //遍歷當前層的節點 TreeNode node = queue.poll(); //彈出佇列中的節點 if((res.size()+1)%2!=0){ //res.size()+1:當前的層數,從1開始 tmp.add(node.val); // 奇數層 -> 尾插 }else{ tmp.add(0,node.val); // 偶數層 -> 頭插 } if(node.left!=null){ //如果左子節點不為空,則將其加入到佇列中 queue.add(node.left); } if(node.right!=null){ //如果左子節點不為空,則將其加入到佇列中 queue.add(node.right); } } res.add(tmp); //將這一層的節點加入到res中 } return res; } }