【剑指offer】32.3 从上到下打印二叉树3 / 按之字形顺序打印二叉树

107 阅读1分钟

题目描述

在这里插入图片描述 在这里插入图片描述

// 32.3 从上到下打印二叉树3 / 按之字形顺序打印二叉树

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


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

题解

///////////////////////////// 列表翻转法 /////////////////////////

// 直接在《32.2 从上到下打印二叉树2》基础上改一改就行
// 新增方向判断符,判断这一层的打印方向。需要反方向则直接反转列表。


// 牛客
// 运行时间:16ms
// 占用内存:9904k
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Collections;
public class Solution {
	
	public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
		ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
		if (pRoot == null)
			return res;
		LinkedList<TreeNode> q = new LinkedList<>();
		int level_count = 0;
        boolean left_dic = false;  // 下一层的方向(从左到右还是从右到左)
		q.offer(pRoot);
		while (!q.isEmpty()) {
			ArrayList<Integer> level = new ArrayList<>();
			level_count = q.size();
            while (level_count > 0) {
                TreeNode node = q.remove();
                level.add(node.val);
                if (node.left != null)
                    q.add(node.left);
                if (node.right != null)
                    q.add(node.right);
                level_count--;
                if (level_count <= 0)
                    left_dic = !left_dic;
            }
            if (!left_dic)
                Collections.reverse(level);
			res.add(level);
		}
		return res;
	}
}


// 力扣
// 执行用时:2 ms, 在所有 Java 提交中击败了27.31%的用户
// 内存消耗:38.4 MB, 在所有 Java 提交中击败了94.68%的用户
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Collections;
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
		if (root == null)
			return res;
		LinkedList<TreeNode> q = new LinkedList<>();
		int level_count = 0;
        boolean left_dic = false;
		q.offer(root);
		while (!q.isEmpty()) {
			ArrayList<Integer> level = new ArrayList<>();
			level_count = q.size();
            while (level_count > 0) {
                TreeNode node = q.remove();
                level.add(node.val);
                if (node.left != null)
                    q.add(node.left);
                if (node.right != null)
                    q.add(node.right);
                level_count--;
                if (level_count <= 0)
                    left_dic = !left_dic;
            }
            if (!left_dic)
                Collections.reverse(level);
			res.add(level);
		}
		return res;
    }
}
////////////////////////////////// 双端队列法 ///////////////////////////////

// 根据方向判定符left_dic,在双端队列(其他数据结构也行)中使用头部入队或者是尾部入队,
// 其他地方还是一样的套路。

// 力扣
// 执行用时:1 ms, 在所有 Java 提交中击败了99.76%的用户
// 内存消耗:38.9 MB, 在所有 Java 提交中击败了21.29%的用户
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Collections;
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
		if (root == null)
			return res;
		LinkedList<TreeNode> q = new LinkedList<>();
		int level_count = 0;
        boolean left_dic = false;  // 下一层的方向(从左到右还是从右到左)
		q.offer(root);
		while (!q.isEmpty()) {
			LinkedList<Integer> level = new LinkedList<>();
			level_count = q.size();
            while (level_count > 0) {
                TreeNode node = q.remove();
				if (left_dic)
					level.addFirst(node.val);
				else 
					level.addLast(node.val);
                if (node.left != null)
                    q.add(node.left);
                if (node.right != null)
                    q.add(node.right);
                level_count--;
                if (level_count <= 0)
                    left_dic = !left_dic;
            }
			res.add(level);
		}
		return res;
    }
}


// 牛客
// 跟力扣一样,只是返回的数据类型有区别
// 力扣的方法在牛客不能用,但是牛客的方法在力扣可以用
// 运行时间:16ms
// 占用内存:9996k
import java.util.ArrayList;
import java.util.LinkedList;
public class Solution {
	
	public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
		if (pRoot == null)
			return res;
		LinkedList<TreeNode> q = new LinkedList<>();
		int level_count = 0;
        boolean left_dic = false;  // 下一层的方向(从左到右还是从右到左)
		q.offer(pRoot);
		while (!q.isEmpty()) {
			ArrayList<Integer> level = new ArrayList<>();
			level_count = q.size();
            while (level_count > 0) {
                TreeNode node = q.remove();
				if (left_dic)
					level.add(0, node.val);  // 如果是ArrayList就这样子操作
				else 
					level.add(node.val);
                if (node.left != null)
                    q.add(node.left);
                if (node.right != null)
                    q.add(node.right);
                level_count--;
                if (level_count <= 0)
                    left_dic = !left_dic;
            }
			res.add(level);
		}
		return res;
	}
}