按之字形順序打印二叉樹


請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其餘行以此類推java


解題思路

這道題能夠藉助兩個棧來實現,用文字很差描述,也許直接看代碼會好一些node

import java.util.ArrayList;
import java.util.Stack;
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
    	// 用來存放結點
        ArrayList<ArrayList<Integer>> list = new ArrayList<>();
        if(pRoot == null) {
            return list; 
        }
        // 判斷奇偶層
        int layer = 1;
        // 存放奇數層結點
        Stack<TreeNode> s1 = new Stack<>();
        // 存放偶數層結點
        Stack<TreeNode> s2 = new Stack<>();
        // 先把根結點放入奇數層
        s1.push(pRoot);
        // 若是兩個棧都爲空,那麼就證實全部結點都已遍歷完畢
        while(!s1.empty() || !s2.empty()) {
        	// 當前層是奇數層
            if(layer % 2 != 0) {
            	// 存放奇數層的結點
                ArrayList<Integer> temp = new ArrayList<>();
                // 把奇數層的結點逐個彈出,用 temp 保存起來
                // 同時把每一個彈出結點的左右子結點壓入棧
                // 要注意棧的特色是後進先出,所以出棧順序和入棧順序是相反的
                while(!s1.empty()) {
                    TreeNode node = s1.pop();
                    if(node != null) {
                        temp.add(node.val);
                        s2.push(node.left);
                        s2.push(node.right);
                    }
                }
                if(!temp.isEmpty()) {
                    list.add(temp);
                    layer++;
                }
            } else {
            	// 原理同上
                ArrayList<Integer> temp = new ArrayList<>();
                while(!s2.empty()) {
                    TreeNode node = s2.pop();
                    if(node != null) {
                        temp.add(node.val);
                        s1.push(node.right);
                        s1.push(node.left);
                    }
                }
                if(!temp.isEmpty()) {
                    list.add(temp);
                    layer++;
                }
            }
        }
        return list;
    }
}
相關文章
相關標籤/搜索