剑指32-1

本文最后更新于:2021年10月19日 下午

剑指 Offer32-I.从上到下打印二叉树


题目要求:

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印.

例如:给定二叉树[3,9,20,null,null,15,7]

    3
   / \
  9  20
     / \
    15 7 

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

题目分析:

  • 对二叉树进行打印实际就是对其进行遍历,根据题目要求,同一层节点按照从左到右的顺序进行遍历,所以应采用层序遍历的方法去遍历。
  • 层序遍历:借助队列进行实现,要保证读取当前节点后,接下里读取器左右节点,然后是左子节点的左右节点,然后是右子节点的左右节点。起初思路有些错误,想通过递归去进行读取,但是递归一旦深入到一棵子树中,便会继续深入下去,是无法返回保证按层读取的,实际上并不需要递归处理。
  • 通过队列实现层序遍历:首先将根节点加入队列,然后当队列不为空时进入循环,每一次循环,取出队列头结点,并读取节点数据,然后将其左右节点加入队列(子节点不为空),这样的话,下一次左子节点从队列头取出,同时将其左右子节点加入队列,这样就保证了队列中的数据顺序是按照层序遍历的顺序弹出的。
  • 注意事项:针对根节点为空,做出针对处理。队列集合对象为Integer,先用Integer数组保存数据,然后转化成int[],返回数组。

代码实现:

class Solution {

ArrayList<Integer> b = new ArrayList<Integer>(1004);
Queue<TreeNode> q = new ArrayDeque<>(1004);
public int[] levelOrder(TreeNode root) {
    if(root == null) {
        int[] a = new int[0];
        return a;
    }
    q.add(root);
    int i = 0;
    TreeNode tem  =  new TreeNode(0) ;
    while(!(q.isEmpty())){
        tem = q.remove();
        b.add(tem.val);
        if(tem.left != null){
            q.add(tem.left);
        }
        if(tem.right != null){
            q.add(tem.right);
        }
    }
    int[] a = new int[b.size()];
    Iterator<Integer> in = b.iterator();
    while(in.hasNext()){
        a[i++] = in.next();
    }
    return a;
    }
}

通过本题主要复习一下使用队列进行层序遍历,以及熟悉Markdown写法。


本文作者: ziyikee
本文链接: https://ziyikee.fun/2021/09/24/%E5%89%91%E6%8C%8732-1/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!