1. 程式人生 > >按之字形順序列印二叉樹(java版)

按之字形順序列印二叉樹(java版)

【題目描述】請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。

【解題思路1】

1.使用兩個棧來分別儲存奇數層節點和偶數層節點。

2.注意兩個棧的插入順序是不同的。

3.對於奇數層來說,也就是從左往右的順序,先新增左子樹,然後新增右子樹。對於偶數層,剛好相反,先新增右子樹,然後新增左子樹。

import java.util.ArrayList;
import java.util.Stack;

public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        int level = 1;
        //s1存奇數層節點
        Stack<TreeNode> s1 = new Stack<TreeNode>();
        s1.push(pRoot);
        //s2存偶數層節點
        Stack<TreeNode> s2 = new Stack<TreeNode>();
        ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
        while (!s1.empty() || !s2.empty()) {
            if (level%2 != 0) {
                ArrayList<Integer> temp = new ArrayList<Integer>();
                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);
                    level++;
                    }
            } else {
                    ArrayList<Integer> temp = new ArrayList<Integer>();
                    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);
                        level++;
                    }
                }
            }
        return list;
    }
}

【解題思路2】

1. 層序遍歷

2.當遍歷到奇數層時,從左到右儲存該層遍歷的值。當遍歷到偶數層時,從右到左儲存該層遍歷的值。 

public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> layers = new ArrayList<ArrayList<Integer>>();
        if (pRoot == null)
            return layers;
        Deque<TreeNode> queue = new LinkedList<TreeNode>();

        queue.offer(pRoot);
        int depth = 0;
        while (!queue.isEmpty()) {
            depth ++;
            ArrayList<Integer> layer = new ArrayList<Integer>();
            int cur = 0, size = queue.size();
            if ((depth & 1) == 0) { //如果是偶數層倒序新增
                Iterator<TreeNode> it = queue.descendingIterator();
                while (it.hasNext()) {
                    layer.add(it.next().val);
                }
            }
            else { //如果是奇數層正序新增
                Iterator<TreeNode> it = queue.iterator();
                while (it.hasNext()) {
                    layer.add(it.next().val);
                }
            }
            while (cur < size) {
                TreeNode node = queue.poll();

                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }

                cur ++;
            }
            layers.add(layer);
        }
        return layers;  
    }
}