打赏

剑指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;
    }
}

 

posted @ 2019-09-15 01:44  海米傻傻  阅读(362)  评论(0编辑  收藏  举报