zl程序教程

您现在的位置是:首页 >  .Net

当前栏目

剑指 Offer 32 . 从上到下打印二叉树

2023-02-18 16:35:25 时间

题目:

【1】第一种

【2】第二种

思路:

【1】第一种,说白了就是正常的二叉树的层次遍历,顺序为从上到下,从左到右,这种一般是借助于队列或者其他数据结构完成。

【2】第二种,算是第一种的变种,在层次遍历的基础上加上返回的数据层次,而且还要对偶数层进行数据的反转。

【3】其次吧,这个题应该可以归到简单类型中。

代码展示:

//剑指 Offer 32 . 从上到下打印二叉树
public class Offer {

    //思路一:说白了就是层次遍历然后统一塞到一个数组里面,顺序为从上到下,从左到右
    public static int[] Method1(TreeNode root){
        if(root == null){
            return new int[0];
        }
        //层次遍历少不了要借助队列
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        ArrayList<Integer> ans = new ArrayList<>();
        while(!queue.isEmpty()) {
            TreeNode node = queue.poll();
            ans.add(node.val);
            if(node.left != null){
                queue.add(node.left);
            }
            if(node.right != null){
                queue.add(node.right);
            }
        }
        // 之所以转一遍是因为ArrayList存储的是对象,所以将Integer对象类型要转回为int用于返回
        int[] res = new int[ans.size()];
        for(int i = 0; i < ans.size(); i++){
            res[i] = ans.get(i);
        }
        return res;
    }

    //思路一:说白了就是层次遍历,然后返回也是要分层次的
    //但是存在一个坑就是,遇到偶数层是从右到左
    public static List<List<Integer>> Method2(TreeNode root){
        if(root==null) {
            return new ArrayList<>();
        }
        //层次遍历少不了要借助队列
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        List<List<Integer>> res = new ArrayList<>();
        int level = 1;
        while(!queue.isEmpty()) {
            int size = queue.size();
            LinkedList<Integer> item = new LinkedList<>();
            for (int i=0;i<size;i++){
                TreeNode node = queue.poll();
                item.add(node.val);
                if(node.left != null){
                    queue.add(node.left);
                }
                if(node.right != null){
                    queue.add(node.right);
                }
            }
            if (level%2 ==1){
                res.add(item);
            }else {
                LinkedList<Integer> temp = new LinkedList<>();
                for (int i = item.size()-1 ; i>=0 ;i-- ){
                    temp.add(item.get(i));
                }
                res.add(temp);
            }
            level++;
        }

        return res;
    }

    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x) { val = x; }
    }
}