从上到下打印二叉树
个人博客
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
题解
-
bfs(队列)
- 算法思想
- 利用队列,将树的元素从上到下,从左到右入队出队
- 复杂度分析
- 时间复杂度 O(n)
- 空间复杂度 O(n):最差的情况下,树为平衡二叉树,此时最多有 n/2 个节点同时在队列中
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public int[] levelOrder(TreeNode root) { if(root == null)return new int[0]; TreeNode node = null; ArrayList<Integer> list = new ArrayList<>(); Queue<TreeNode> queue = new ArrayDeque<>(); queue.add(root); while(queue.size() != 0){ node = queue.poll(); 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; } }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vAizBo85-1596681445824)(/Users/apple/Library/Application Support/typora-user-images/image-20200806011736672.png)]
- 算法思想
总结
- 熟能生巧
从上到下打印二叉树(分层)
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
题解
-
bfs
- 利用队列,进入每一层之前计算队列中元素的个数,然后将这些元素装入 list 中
- 复杂度分析
- 时间复杂度 O(n)
- 空间复杂度 O(n):最差的情况下,树为平衡二叉树,此时最多有 n/2 个节点同时在队列中
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public List<List<Integer>> levelOrder(TreeNode root) { TreeNode node = null; List<List<Integer>> list = new ArrayList<>(); Queue<TreeNode> queue = new ArrayDeque<>(); if(root != null)queue.add(root); while(queue.size() != 0){ List<Integer> arr = new ArrayList<>(); for(int i = queue.size();i>0;i--){ node = queue.poll(); arr.add(node.val); if(node.left != null)queue.add(node.left); if(node.right != null)queue.add(node.right); } list.add(arr); } return list; } }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XLbOsOF9-1596681445827)(/Users/apple/Library/Application Support/typora-user-images/image-20200806014031104.png)]
总结
- 之前做过分层的题,但是今天再次做分层却无从下手,不知道如何确定元素在哪一层,看了人家的解答之后才恍然大悟,原来可以先统计队列中元素的个数,然后作为一层,进行出队,顺便将他们的子节点入队,直到个数减为 0
从上到下打印二叉树 III
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
题解
-
两个栈(重点是先进后出的思想---->这意味着会在每一层都颠倒 顺序,即按照之字形)
- 在奇数层,加入子节点的时候,按照从右到左加入
- 在偶数层,按照从左到右加入
-
bfs
- 算法思想
- 利用双端队列,当 res 中元素为单数的时候,证明此时候到了偶数层,则使用 addFirst
- 否则使用 add
- 复杂度分析
- 时间复杂度 O(n)
- 空间复杂度 O(n):最差的情况下,树为平衡二叉树,此时最多有 n/2 个节点同时在队列中
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public List<List<Integer>> levelOrder(TreeNode root) { TreeNode node = null; Queue<TreeNode> queue = new ArrayDeque<>(); List<List<Integer>> res = new ArrayList<>(); if(root != null)queue.add(root); while(!queue.isEmpty()){ LinkedList<Integer> list = new LinkedList<>(); for(int i = queue.size();i > 0;i--){ node = queue.poll(); if(res.size()%2 == 1)list.addFirst(node.val); else 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; } }
- 算法思想
总结
-
注意我们出入栈的顺序还是一样的,只是我们的值进入 list 的书序改变了,事实上会不会有点作弊?其实可以使用两个栈来实现