当前位置: 代码迷 >> 综合 >> 剑指 offer day6
  详细解决方案

剑指 offer day6

热度:47   发布时间:2023-11-24 17:20:25.0

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

题目:

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。---->层次遍历二叉树

题解:

1、构造一个节点队列,如果队列不为空,则首先将根节点存入队列中;

2、当队列不为空时,获取队列的头并将val值存入list集合中,此时

-如果当前节点有左孩子节点,则将左孩子入队;
-如果当前节点有右孩子节点,则将右孩子入队。

    public int[] levelOrder(TreeNode root) {
    if (root==null){
    return new int[0];}Queue<TreeNode> queue = new LinkedList<>();List<Integer> list = new ArrayList<>();queue.add(root);while (!queue.isEmpty()){
    TreeNode node = queue.remove();list.add(node.val);if (node.left!=null){
    queue.add(node.left);}if (node.right!=null){
    queue.add(node.right);}}int[] res = new int[list.size()];for (int i= 0 ;i<list.size();i++){
    res[i]=list.get(i);}return res;}

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

题目:

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

题解:

为了实现将每层数据打印到一行中,以打印[3,9,20,null,null,15,7]为例

1、第一行(3):初始状态队列中只有1个根节点3,则需要在队列中取出1(==queue.size())个元素并放入list集合中,并将左右孩子入队;

2、 第二行(9、20):在步骤1之后,此时队列中有9和20,则此时需要在队列中取出2(==queue.size())个元素并放入list集合中;

3、依此类推,每次均需获取当前队列.size()个数据,并存入list集合,再将其左右孩子入队用于下次输出。

注意: 在获取queue.size()个数据时,for循环不能写成如下形式:

 for (int i = 0;i<queue.size();i++){
    }
//因为在后续操作中,需要将出队的元素的左右孩子入队
//即队列的长度会发生变化
    public List<List<Integer>> levelOrder(TreeNode root) {
    List<List<Integer>> res = new ArrayList<>();if (root==null){
    return res;}Queue<TreeNode> queue = new LinkedList<>();queue.add(root);while (!queue.isEmpty()){
    List<Integer> list = new ArrayList<>();for (int i = queue.size(); i > 0; i--){
    TreeNode node = queue.remove();list.add(node.val);if (node.left!=null){
    queue.add(node.left);}if (node.right!=null){
    queue.add(node.right);}}res.add(list);}return res;}

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

题目:

请实现一个函数按照字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

题解:

奇数行从左到右打印,偶数行从右向左打印,相比于剑指 Offer 32 II来讲,只需要增加一个times来记录当前层数,如果times为偶数则将list翻转Collections.reverse(list)

 public List<List<Integer>> levelOrder(TreeNode root) {
    List<List<Integer>> res = new ArrayList<>();if (root==null){
    return res;}Queue<TreeNode> queue = new LinkedList<>();queue.add(root);int times=1;//用于记录当前层数while (!queue.isEmpty()){
    List<Integer> list = new ArrayList<>();for (int i = queue.size(); i > 0; i--){
    TreeNode node = queue.remove();list.add(node.val);if (node.left!=null){
    queue.add(node.left);}if (node.right!=null){
    queue.add(node.right);}}if (times%2==0){
    Collections.reverse(list);}res.add(list);times++;}return res;}

哈哈哈哈哈哈哈哈哈哈哈!
左眼皮跳:要发大财了
右眼皮跳:去***的封建迷信

  相关解决方案