剑指offer之面试题32:从上到下打印二叉树

面试题32:从上到下打印二叉树

题目一:不分行从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点按照从做到右的顺序打印。例如下图的二叉树,则依次打印出 8 6 10 5 7 9 11。

在这里插入图片描述

思路:借助队列实现二叉树的层序遍历

代码实现:这里写复杂了,后面有时间再改(用T03的方法)

package Question32;


import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

public class T01 {
    public static void main(String[] args) {
        Node node8 = new Node(8);
        Node node6 = new Node(6);
        Node node10 = new Node(10);
        Node node5 = new Node(5);
        Node node7 = new Node(7);
        Node node9 = new Node(9);
        Node node11 = new Node(11);

        node8.left = node6;
        node8.right = node10;
        node6.left = node5;
        node6.right = node7;
        node10.left = node9;
        node10.right = node11;

        System.out.println(solve(node8).length);
    }

    public static int[] solve(Node root) {
        if(root == null) return null;
        int[] arr = new int[1000];
        int index = 0;
        Queue<Node> queue = new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()) {
            arr[index++] = queue.peek().val;
            Node cur = queue.poll();
            if(cur.left != null) queue.add(cur.left);
            if(cur.right != null) queue.add(cur.right);
        }
        return Arrays.copyOf(arr, index);
    }
}

class Node {
    int val;
    Node left;
    Node right;

    public Node(int val) {
        this.val = val;
    }
}

题目2:分行从上到下打印二叉树
从上到下按层打印二叉树,同一层的节点按从做到右的顺序打印,每一层打印到第一行。例如,上图的二叉树应该打印如下内容:
8
6 10
5 7 9 11

思路:在上题的基础上,增加一个curLevelCount 和 nextLevelCount 变量分别记录本层和下层的节点数目。本层节点数用于判断什么时候到达了一层的末尾,并且在遍历过程中通过子节点的有无增加nextLevelCount。在到达一层的末尾并且开始访问下一层是,curLevelCount = nextLevelCount,nextLevelCount = 0;

代码实现:这里写复杂了,后面有时间再改(用T03的方法)

package Question32;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class T02 {
    public static void main(String[] args) {
        Node node8 = new Node(8);
        Node node6 = new Node(6);
        Node node10 = new Node(10);
        Node node5 = new Node(5);
        Node node7 = new Node(7);
        Node node9 = new Node(9);
        Node node11 = new Node(11);

        node8.left = node6;
        node8.right = node10;
        node6.left = node5;
        node6.right = node7;
        node10.left = node9;
        node10.right = node11;

        System.out.println(solve(node8));
    }

    public static List<List<Integer>> solve(Node root) {
        if(root == null) return new ArrayList<List<Integer>>();
        Queue<Node> queue = new LinkedList<>();
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        List<Integer> curLevelNodes = new ArrayList<>();
        int curLevelCount = 1, nextLevelCount = 0;
        queue.add(root);
        while(!queue.isEmpty()) {
            Node curNode = queue.poll();
            curLevelNodes.add(curNode.val);
            curLevelCount--;
            if(curNode.left != null) {
                queue.add(curNode.left);
                nextLevelCount++;
            }
            if(curNode.right != null) {
                queue.add(curNode.right);
                nextLevelCount++;
            }
            if(curLevelCount == 0) {
                result.add(curLevelNodes);
                curLevelNodes = new ArrayList<>();
                curLevelCount = nextLevelCount;
                nextLevelCount = 0;
            }
        }
        return result;
    }
}

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

思路:定义一个方向即可

代码实现:

package Question32;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;
import java.util.List;

public class T03 {

     public List<List<Integer>> levelOrder(TreeNode root) {
         List<List<Integer>> result = new ArrayList<List<Integer>>();
         if(root == null) return result;
         Queue<TreeNode> queue = new LinkedList<>();
         queue.offer(root);
         boolean direction = false;
         while(!queue.isEmpty()) {
             List<Integer> tempList = new ArrayList<>();
             int size = queue.size();
             for(int i = 0; i < size; i++) {
                 TreeNode node = queue.poll();
                 tempList.add(node.val);
                 if(node.left != null) queue.offer(node.left);
                 if(node.right != null) queue.offer(node.right);
             }
             if(direction) Collections.reverse(tempList);
             direction = !direction;
             result.add(tempList);
         }
         return result;
     }
}

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    
    public TreeNode(int x) {
        val = x;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值