层序遍历:从根节点开始,从上到下,从左到右访问每一个节点。
二叉树节点定义:
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
层序遍历:用队列实现。
具体操作:根节点入队;while循环判断队列不空时,弹出一个节点,访问它,并把它的左右孩子节点入队(父亲节点出队,儿子节点入队)。有点花木兰代父从军的意思哈。
最简单的层序遍历模板:
public void levelOrder(TreeNode root) {
if (root == null) {
return;
}
Queue queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode cur = queue.poll();
System.out.println(cur.val);
if (cur.left != null) {
queue.offer(cur.left);
}
if (cur.right != null) {
queue.offer(cur.right);
}
}
}
解答LeetCode102、107、103、199题,只需要在上面的模板进行修改。
102. Binary Tree Level Order Traversal
题目地址:https://leetcode.com/problems/binary-tree-level-order-traversal/description/
根据题目要求我们需要知道遍历时的层数,也就是说,需要知道每层有多少个节点,而队列的size()就是这个队列里面的节点数量,每次进入while循环的时候通过queue.size()就可以得到这一层的节点数,然后遍历这些节点就可以了。
class Solution {
public List> levelOrder(TreeNode root) {
List> res = new ArrayList<>();
if(root == null){
return res;
}
Queue queue = new LinkedList();
queue.offer(root);
while(!queue.isEmpty()){
int size = queue.size();
List list = new ArrayList();
for(int i=0;i
107. Binary Tree Level Order Traversal II
题目地址:https://leetcode.com/problems/binary-tree-level-order-traversal-ii/description/
这一题的层是从下到上的,只需要改变res.add(E e)方式,改为res.add(int index,E e);具体的这两个方法有什么不同可以参考Java的APIhttps://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ArrayList.html
class Solution {
public List> levelOrderBottom(TreeNode root) {
List> res = new ArrayList<>();
if(root == null ){
return res;
}
Queue queue = new LinkedList();
queue.offer(root);
while(!queue.isEmpty()){
int size = queue.size();
List list = new ArrayList();
for(int i=0;i
103. Binary Tree Zigzag Level Order Traversal
题目地址:https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/description/
“之”字型层序遍历,有了上面两个题的基础,这个题很好解决,只需要记录一下层数,分情况使用ArrayList.add(E e)和ArrayList.add(int index,E e)即可解决。
class Solution {
public List> zigzagLevelOrder(TreeNode root) {
List> res = new ArrayList<>();
if(root == null ){
return res;
}
Queue queue = new LinkedList();
queue.offer(root);
int level = 0;
while(!queue.isEmpty()){
int size = queue.size();
List list = new ArrayList();
for(int i=0;i
199. Binary Tree Right Side View
题目地址:https://leetcode.com/problems/binary-tree-right-side-view/description/
二叉树的右视图,层序遍历,只将每层最后一个节点的值添加ArrayList中返回。
class Solution {
public List rightSideView(TreeNode root) {
List res = new ArrayList<>();
if(root == null){
return res;
}
Queue queue = new LinkedList();
queue.offer(root);
while(!queue.isEmpty()){
int size = queue.size();
List list = new ArrayList();
for(int i=0;i