1. 层次遍历简介
1.1. 二叉树的层次遍历 102
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res=new ArrayList<>();
Map<Integer,List<Integer>> map=new HashMap<>();
if(root==null){
return res;
}
searchNode(root,map,1);
for (List<Integer> value : map.values()) {
res.add(value);
}
return res;
}
private void searchNode(TreeNode root, Map<Integer,List<Integer>> map,int x) {
List<Integer> list = map.getOrDefault(x, new ArrayList<>());
list.add(root.val);
map.put(x,list);
if(root.left!=null){
searchNode(root.left,map,x+1);
}
if(root.right!=null){
searchNode(root.right,map,x+1);
}
}
}
1.2. 二叉树的层次遍历Ⅱ
将上题得到res反转一下就可
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> res=new ArrayList<>();
Map<Integer,List<Integer>> map=new HashMap<>();
if(root==null){
return res;
}
searchNode(root,map,1);
Set<Integer> keySet = map.keySet();
List<Integer>[] arr=new List[keySet.size()];
for (Integer integer : keySet) {
arr[integer-1]=map.get(integer);
}
for (int i = arr.length-1; i >=0; i--) {
res.add(arr[i]);
}
return res;
}
private void searchNode(TreeNode root, Map<Integer,List<Integer>> map,int x) {
List<Integer> list = map.getOrDefault(x, new ArrayList<>());
list.add(root.val);
map.put(x,list);
if(root.left!=null){
searchNode(root.left,map,x+1);
}
if(root.right!=null){
searchNode(root.right,map,x+1);
}
}
}
2. 基本的层序遍历与变换
class Solution {
public static void main(String[] args) {
TreeNode root=new TreeNode(3,new TreeNode(9),new TreeNode(20,new TreeNode(15),new TreeNode(7)));
zigzagLevelOrder(root);
}
public static List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> res=new ArrayList<>();
if(root==null) return res;
LinkedList<TreeNode> queue=new LinkedList<>();
Boolean flag=true;
queue.offer(root);
while (!queue.isEmpty()){
List<Integer> list=new ArrayList<>();
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
list.add(node.val);
if(node.left!=null) queue.offer(node.left);
if(node.right!=null) queue.offer(node.right);
}
if(flag){
res.add(list);
}else {
List<Integer> listR=new ArrayList<>();
for (int i = list.size()-1; i >=0; i--) {
listR.add(list.get(i));
}
res.add(listR);
}
flag=!flag;
}
return res;
}
}