劍指offer:按之字形打印二叉樹(棧|雙向隊列+中序遍歷)

1. 題目描述

/**
    請實現一個函數按照之字形打印二叉樹,

    即第一行按照從左到右的順序打印,
    第二層按照從右至左的順序打印,
    第三行按照從左到右的順序打印,
    其餘行以此類推。
*/

2. 雙向隊列

/*思路:利用Java中的LinkedList的底層實現是雙向鏈表的特色。
  1)可用作隊列,實現樹的層次遍歷
  2)可雙向遍歷,奇數層時從前向後遍歷,偶數層時從後向前遍歷
*/

3. 代碼(雙向鏈表+層次遍歷)

import java.util.*;

public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        return levelorder(pRoot);
    }
     public static ArrayList<ArrayList<Integer>> levelorder(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        if(root == null) return result;
        queue.offer(root); // 首先將根節點root入隊
        int level = 0;//記錄層數
        while (!queue.isEmpty()) {// Queue不爲空則循環
            LinkedList<Integer> node = new LinkedList<>();// 保存每一層節點的值
            int length = queue.size();// 每一層的節點數目
            while (length > 0) {
                TreeNode tree = queue.poll();
                if (tree.left != null) {
                    queue.offer(tree.left);
                }
                if (tree.right != null) {
                    queue.offer(tree.right);
                }
                if((level+1)%2==0){
                    node.addFirst(tree.val);
                }else{
                    node.add(tree.val);
                }
                
                length--;
            }
            
            // node爲本層遍歷結果
            // 將linkedlist轉成 ArrayList
            ArrayList<Integer> arrayNode = new ArrayList<>();
            for (Integer i: node) {
                arrayNode.add(i);
            }
            result.add(arrayNode);
            //循環結束後,獲得的Queue爲下一層作準備,
            level++;
        }
        return result;
    }
}
相關文章
相關標籤/搜索