102.二叉树的层序遍历
给你二叉树的根节点 root
,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
解题思路
- 使用队列
- 把每一层的元素从队列中获取出来,构成数组。
- 把每一层的元素的左右元素添加到队列中去
- 对二叉树进行判空处理
Java实现
class Solution_LC102 {
public List<List<Integer>> levelOrder(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List<List<Integer>> result = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
int len = queue.size();
List<Integer> itemList = new ArrayList<>();
while (len > 0) {
TreeNode treeNode = queue.poll();
itemList.add(treeNode.val);
if (treeNode.left != null) {
queue.add(treeNode.left);
}
if (treeNode.right != null) {
queue.add(treeNode.right);
}
len--;
}
result.add(itemList);
}
return result;
}
}
107.二叉树的层次遍历 II
给你二叉树的根节点 root
,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]
解题思路
- 使用链表代替ArrayList,可以使用
addFirst
Java实现
class Solution_LC107 {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
LinkedList<List<Integer>> result = new LinkedList<List<Integer>>();
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
List<Integer> itemList = new ArrayList<>();
int len = queue.size();
while (len > 0) {
TreeNode tempNode = queue.poll();
itemList.add(tempNode.val);
if (tempNode.left != null) {
queue.offer(tempNode.left);
}
if (tempNode.right != null) {
queue.offer(tempNode.right);
}
len--;
}
result.addFirst(itemList);
}
return result;
}
}
199.二叉树的右视图
给定一个二叉树的 根节点 root
,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]
解题思路
- 使用for循环,遍历每一行的数据,将最后一个元素添加到结果集中。
Java实现
class Solution_LC199 {
public List<Integer> rightSideView(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List<Integer> result = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
int len = queue.size();
for (int i = 0; i < len; i++) {
TreeNode treeNode = queue.poll();
if (treeNode.left != null) {
queue.add(treeNode.left);
}
if (treeNode.right != null) {
queue.add(treeNode.right);
}
if (i == len - 1) {
result.add(treeNode.val);
}
}
}
return result;
}
}
剑指 Offer 32 - III. 从上到下打印二叉树 III
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定二叉树: [3,9,20,null,null,15,7]
,
返回其层次遍历结果:
[
[3],
[20,9],
[15,7]
]
解题思路
- 使用链表用来倒置添加元素
- 根据
result.size() % 2==0
判断是否在奇数层
Java实现
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
List<List<Integer>> result = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
int len = queue.size();
LinkedList<Integer> itemList = new LinkedList<>();
while (len > 0) {
TreeNode treeNode = queue.poll();
if (treeNode.left != null) {
queue.add(treeNode.left);
}
if (treeNode.right != null) {
queue.add(treeNode.right);
}
if (result.size() % 2 == 0) {
itemList.addLast(treeNode.val);
} else {
itemList.addFirst(treeNode.val);
}
len--;
}
result.add(itemList);
}
return result;
}
}