二叉树层次遍历

103 阅读1分钟

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;

    }
}