这篇文章主要讲解二叉树的层序遍历,及其变形。
LeetCode102 二叉树的层序遍历
给你二叉树的根节点
root
,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]示例 2:
输入:root = [1] 输出:[[1]]示例 3:
输入:root = [] 输出:[]
这道题是最基本的二叉树的层序遍历。可以利用队列来实现,先将根节点放入队列中,不断遍历二叉树就好了。
定义一个size遍历表示每一层的节点数。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
if(root == null)
return new ArrayList<List<Integer>>();
List<List<Integer>> res = new ArrayList<List<Integer>>();
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root);
//将根节点放入队列中,然后不断遍历队列
while(queue.size() > 0){
//获得当前队列的长度,也就是当前这一层的元素个数
int size = queue.size();
ArrayList<Integer> tmp = new ArrayList<>();
//将队列中的元素都拿出来(获取这一层的结点),放到临时list中
//如果结点的左右子树不为空,也放入到队列中
for(int i = 0;i < size;i++){
TreeNode t = queue.remove();
tmp.add(t.val);
if(t.left != null)
queue.add(t.left);
if(t.right != null)
queue.add(t.right);
}
//此时的tmp就是当前层的全部元素,用List类型的tmp保存,加入到最终的结点集合中。
res.add(tmp);
}
return res;
}
}
LeetCode199 二叉树的右视图
给定一个二叉树的 根节点
root
,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例 1:
输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2:
输入: [1,null,3] 输出: [1,3]示例 3:
输入: [] 输出: []
这道题是上面的变形,既然每层的结点都得到了。
那只要判断得到的结点是不是每层的最后一个就好了。
如果是,则将他的值存入数组。
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> ans = new ArrayList<Integer>();
Deque<TreeNode> queue = new ArrayDeque<TreeNode>();
if(root != null)
queue.add(root);
while(!queue.isEmpty()){
int size = queue.size();
for(int i = 0 ;i < size;i++){
TreeNode tmp = queue.remove();
if(tmp.left != null)
queue.add(tmp.left);
if(tmp.right != null)
queue.add(tmp.right);
if(i == size - 1)
ans.add(tmp.val);
}
}
return ans;
}
}