TypechoJoeTheme

Toasobi的博客

从上打印二叉树2(中等)

本文最后更新于2023年03月16日,已超过552天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

- 这题上一题是从上至下打印二叉树,其实就是层序遍历,**这题多了一个偶数高度的数组要逆转。**

上面是上一题的图。虽然是层序遍历,但是要求是每一层的数据都要一个list存储。所以这两道题的难点之一就是如何知道哪些数据是在同一个高度的,并将这些数据放入各个list中。而第二个难点就是逆转数组了

对于如何知道数据是否在一个高度,我一开始的想法是用hashmap,key值存储高度,value存储数据。但是由于hashmap的key值不能重复只能就此作罢。我甚至想到了使用2的指数表示每一层的元素个数,同时使用一个int记录该层缺失多少元素。但是由于该层缺失多少元素非常难求,这个方法在只有一条线的二叉树面前直接寄掉了;;

最后是题解给我的启发,在每次对队列添加完一层的元素后使用队列的长度作为for循环的临界值,每次for循环完成后表示一层的数据都遍历完成,在for循环中每遍历一个添加至一个list中,最后放入大list中,并重新new list()将list全部重置。

代码如下:

<div>/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        int height = 1; //树的高度
        List<List<Integer>> array = new ArrayList<>(); //返回结果
        if (root == null) {
            return array;
        }
        LinkedList<TreeNode> queue = new LinkedList<>(); //队列

        queue.push(root); //头结点放入

        while(!queue.isEmpty()){ //队列不为空
            int currentSize = queue.size();
            List<Integer> ans = new ArrayList<>(); //返回子结果
            for(int i=0;i<currentSize;i++){
                TreeNode treeNode = queue.removeLast();//出队
                ans.add(treeNode.val); //放入list
                if(treeNode.left != null){
                    queue.push(treeNode.left);
                }
                if(treeNode.right != null){
                    queue.push(treeNode.right);
                } 
            }
            if(height % 2 == 0){
                Collections.reverse(ans);
            }
            array.add(ans);
            ans = new ArrayList<>(); //重置list
            height++; //层数加一
        }
        return array;
    }
}</div>
朗读
赞(0)
评论 (0)