二叉树的层序遍历(102)
思路(前序,后序,中序遍历):
二叉树的层序遍历不同于二叉树的前序,后序,中序遍历,层序遍历是将二叉树的每一层从根部开始进行遍历,
将每一层的节点都放到1个集合中,
//先创建1个队列来表示每层的TreeNode
Queue<TreeNode> queue = new LinkedList<>();
最后再用1个大集合将所有层的节点情况全部收集起来。
//统计所有层数的集合
List<List<Integer>> arr = new ArrayList<List<Integer>>();
这里使用到了2个队列
因此我们这里使用队列,先将根节点加入到队列a中
//先将根节点root加进去
queue.add(root);
再创建1个b队列,接着弹出根节点到b队列中的同时在判断根节点是否有左子节点和右子节点,若有的话就将左子节点和右子节点都加入到a队列中
while(!queue.isEmpty()){
//获取当前层的个数
int size = queue.size();
//先new1个ArrayList来接收
List<Integer> list = new ArrayList<>();
//遍历当前层
for(int i = 0;i<size;i++){
//将当前的节点取出
TreeNode node = queue.poll();
list.add(node.val);
if(node.left != null){
queue.add(node.left);
}
if(node.right != null){
queue.add(node.right);
}
}
arr.add(list);
}
我们接着创建1个集合去接收每一层的节点数,再将该集合放入到1个统计所有层节点的集合中去,只要队列不为Null接着继续重复该操作。
代码解答:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
//先创建1个队列来表示每层的TreeNode
Queue<TreeNode> queue = new LinkedList<>();
//统计所有层数的集合
List<List<Integer>> arr = new ArrayList<List<Integer>>();
if(root == null){
return new ArrayList<>();
}
//先将根节点root加进去
queue.add(root);
//只要当前的队列不为null
while(!queue.isEmpty()){
//获取当前层的个数
int size = queue.size();
//先new1个ArrayList来接收
List<Integer> list = new ArrayList<>();
//遍历当前层
for(int i = 0;i<size;i++){
//将当前的节点取出
TreeNode node = queue.poll();
list.add(node.val);
if(node.left != null){
queue.add(node.left);
}
if(node.right != null){
queue.add(node.right);
}
}
arr.add(list);
}
return arr;
}
}
翻转二叉树(226)
这道题的翻转是除了根节点,左子树和右子树都要翻转,因此我们不需要考虑根节点,只考虑左右子树即可,
在解决这道题之前我们先来回顾一下怎么交换2个数的值
int a = 1;
int b = 2;
//先定义1个temp作为交换的介质
int temp = 0;
temp = a;
a = b;
b = temp;
这道题也是如此,我们需要定义1个临时的树去存储左子树,再进行交换
//先创建1个临时的树去存储临时的左子树
TreeNode tempTree = root.left;
//递归到最后
root.left = root.right;
root.right = tempTree;
显然我们只这样做是不行的,我们所得到树最后1层并没有彻底交换,因此我们遇到树的问题就要考虑递归,
//先创建1个临时的树去存储临时的左子树
TreeNode tempTree = invertTree(root.left);
//递归到最后
root.left = invertTree(root.right);
root.right = tempTree;
这样就解决了
代码解答:
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null){
return root;
}
//先创建1个临时的树去存储临时的左子树
TreeNode tempTree = invertTree(root.left);
//递归到最后
root.left = invertTree(root.right);
root.right = tempTree;
return root;
}
}