32 - III. 从上到下打印二叉树 III

题目描述:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

解题思路:

在Java中可以利用LinkedList作为双端队列使用(addFirst(x)、addLast(x))。在Java/C++中将奇偶分类讨论。

方法一:双端队列(Java)

 class Solution {
    public List> levelOrder(TreeNode root) {
        List> contain = new ArrayList<>();
        if(root == null) return contain;
        LinkedList que = new LinkedList<>();
        que.offer(root);
        int next = 1;
        while(!que.isEmpty()){
            LinkedList value = new LinkedList<>();
            int size = que.size();
            for(int i = 0; i < size;i++){
                TreeNode node = que.poll();
                if(next % 2 == 0) value.addFirst(node.val);
                else value.addLast(node.val);
                if(node.left != null) que.add(node.left);
                if(node.right != null) que.add(node.right);
            }
            contain.add(value);
            next++;
        }
        return contain;
    }
}

方法二:奇偶讨论(C++)

class Solution {
public:
    vector> levelOrder(TreeNode* root) {
        vector> contain;
        if(!root) return contain;
        queue que;
        que.push(root);
        int next = 1;
        while(!que.empty()){
            int size = que.size();
            vector value;
            for(int i = 0;i < size;i++){
                TreeNode* node = que.front();
                value.push_back(node -> val);
                if(node -> left) que.push(node -> left);
                if(node -> right) que.push(node -> right);
                que.pop();
            }
            if(next % 2 == 0) reverse(value.begin(), value.end());
            contain.push_back(value);
            next++;
        }
        return contain;
    }
};

2022-Java
解题思路:
(1)分奇偶,借助辅助栈
(2)将每一层的元素压入栈后,依次弹出给到当前层的队列

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List> levelOrder(TreeNode root) {
        List> result = new ArrayList<>();
        if(root == null) return result;
        // 当前层队列
        LinkedList queue = new LinkedList<>();
        // 辅助栈
        LinkedList stack = new LinkedList<>();
        queue.addLast(root);
        // 当前层打印
        ArrayList tmp_list = new ArrayList<>();
        int i = 1;
        while(queue.size() != 0){
            TreeNode node = queue.removeFirst();
            tmp_list.add(node.val);
            // 从左到右压入栈
            if(i % 2 == 1){
                if(node.left != null){
                    stack.addLast(node.left);
                }
                if(node.right != null){
                    stack.addLast(node.right);
                }
            }else{
            // 从右到左压入栈
                if(node.right != null){
                    stack.addLast(node.right);
                }
                if(node.left != null){
                    stack.addLast(node.left);
                }
            }
            // 完成当前层
            if(queue.size() == 0){
                // 当前层 已全部压入栈
                while(!stack.isEmpty()){
                    TreeNode cur_node = stack.removeLast();
                    queue.addLast(cur_node);
                }
                result.add(tmp_list);
                tmp_list = new ArrayList();
                i++;
            }
        }
        return result;
    }
}

你可能感兴趣的:(32 - III. 从上到下打印二叉树 III)