面试笔试准备(1)

本篇内容为牛客网,左程云算法课程课堂笔记。

(1)有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。

给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列。保证结点数小于等于500。

要点:(1)使用队列实现二叉树的层次遍历。(2)注意换行。(3)对输出的理解。

           (1)队列实现二叉树的层次遍历:从根节点开始,一层一层打印这个二叉树。首先在队列中装入根节点。然后,当队列不为空的时候,弹出队首节点,并将弹出节点的左右孩子入队列(如果存在的话)。这是二叉树层次遍历的主要过程。

           (2)换行:换行的实现,是通过两个标志指:last用来指向从队列中弹出的节点所在行的最右节点,一个用来跟踪下一层的节点入队列的情况。,当last等于弹出节点,说明该换行了。并将last等于nlast.

            (3) 对输出的理解:输出肯定有多种方式。但是本人基础较差。因此,在这里特意给自己叮嘱一下:使用arraylist来保存输出结果,每一层都使用一个动态数组来保存,然后,整个二叉树,使用一个大的list来保存不同层的list。

public int[][] printTree(TreeNode root) {
        ArrayList> list=new ArrayList<>();//用来装每层的遍历值。
        ArrayList list2=new ArrayList<>();
        TreeNode last=root;
        TreeNode nlast=root;
        Queue queue=new LinkedList<>();//用一个队列进行便利。
        queue.add(root);
        while (!queue.isEmpty()) {
			TreeNode tmp=queue.poll();
			list2.add(tmp.val);
			if (tmp.left!=null) {
				queue.add(tmp.left);
				nlast=tmp.left;
			}
			if (tmp.right!=null) {
				queue.add(tmp.right);
				nlast=tmp.right;
			}
			if (tmp==last) {
				last=nlast;
				list.add(list2);
				list2=new ArrayList<>();
			}
			
		}
        int res[][]=new int[list.size()][];
        for (int i = 0; i < list.size(); i++) {
			res[i]=new int[list.get(i).size()];
			for (int j = 0; j < res[i].length; j++) {
				res[i][j]=list.get(i).get(j);
			}
		}
        return res;
    }

你可能感兴趣的:(面试笔试准备(1))