剑指Offer32-Z字形打印二叉树

题目

请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二行是从右到左的顺序打印,第三行再按照从左到右的顺序打印,依次类推。

示例

给定二叉树: [3,9,20,null,null,15,7],
3
/  \
9 20
   /   \
15    7

返回结果:
[
[3],
[20,9],
[15,7]
]

解题思路

对于二叉树的奇数层,第1,3,5…层,从左到右遍历,对于偶数层从右到左遍历。
维护一个列表,根据结果集中的size()判断当前是奇数层还是偶数层。
因为初始结果集中的大小是0,第一层是奇数层,可以推出。
size()=0,第一层 奇数层
size()=1,第二层 偶数层
size()=2,第三层 奇数层

所以 result.size()%2==1代表当前遍历的是偶数层需要翻转临时列表。

编码实现

 public List<List<Integer>> levelOrder(TreeNode root) {
    
    
        //双端队列保存树中每一层的节点
        Deque<TreeNode> dequeue = new LinkedList<TreeNode>();
        //定义结果集
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        if (root!=null) dequeue.add(root);
        while(!dequeue.isEmpty()){
    
    
            LinkedList<Integer> temp = new LinkedList<Integer>();
            for (int i = 0; i < dequeue.size(); i++) {
    
    
                TreeNode node = dequeue.poll();
                //从队列中取出节点,将节点中的数据添加到临时list中
                temp.add(node.val);
                if (node.left!=null){
    
    
                    dequeue.add(node.left);
                }
                if (node.right!=null){
    
    
                    dequeue.add(node.right);
                }
            }
            //如果是奇数层需要翻转这层的节点
            if (result.size()%2==1) {
    
    
                 Collections.reverse(temp);
            }
            result.add(temp);

        }
        return result;
    }

参考:LeetCode K神解法三

おすすめ

転載: blog.csdn.net/qq_43672652/article/details/114646830