算法第十二天|二叉树-层序遍历

102. 二叉树的层序遍历

  List<List<Integer>> list = new ArrayList<>();

    public List<List<Integer>> levelOrder(TreeNode root) {
        if (root == null) {
            return new ArrayList<>();
        }
        getListByLevel(root, 0);
        return list;
    }



    private void getListByLevel(TreeNode root, int level) {
        if (root == null) return;

        if (list.size() == level) {
            list.add(new ArrayList<>()); // 有一个元素了
        }

        list.get(level).add(root.val);
        getListByLevel(root.left, level + 1);
        getListByLevel(root.right, level + 1);
    }

层序遍历,不可避免地想到遍历时与深度的关联性

当遍历第一层时,deep = 0,这时候list.size()也等于0,所以需要加入列表。

  1. 二叉树的层序遍历 II
 List<List<Integer>> list = new ArrayList<>();

    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        if (root == null) return list;

        getListByNode(root, 0);
//        reverseList();
        Collections.reverse(list);

        return list;
    }

    private void reverseList() {
        Stack<List<Integer>> stack = new Stack<>();

        for (int i = 0; i < list.size(); i++) {
            stack.push(list.get(i));
        }

        List<List<Integer>> demoList = new ArrayList<>(stack.size());
        while (!stack.isEmpty()) {
            demoList.add(stack.pop());
        }

        list = demoList;
    }

    private void getListByNode(TreeNode root, int deep) {
        if (root == null) {
            return;
        }

        if (list.size() == deep) {
            list.add(new ArrayList<>());
        }
        list.get(deep).add(root.val);
        getListByNode(root.left, deep+1);
        getListByNode(root.right, deep+1);
    }

和层次遍历I区别不大

  1. 二叉树的右视图
   List<Integer> list = new ArrayList<>();

    public List<Integer> rightSideView(TreeNode root) {
        if (root == null)  {
            return list;
        }
        getListByRoot(root, 0);
        return list;
    }

     private  void getListByRoot(TreeNode root, int deep) {
        if (root == null) {
            return;
        }

        if (list.size() == deep) {
            list.add(root.val);
        }
        getListByRoot(root.right, deep + 1);
        getListByRoot(root.left, deep + 1);
    }

当size和deep相等的时候才放入,意味着,每一层只放入一个元素。

由于是先放入的右子树,那么默认会先存放右子树的元素,然后才考虑左子树

637.二叉树的层平均值

 List<List<Integer>> list = new ArrayList<>();

    public List<Double> averageOfLevels(TreeNode root) {
        List<Double> doubles = new ArrayList<>();
        if (root == null) {
            return doubles;
        }

        getListByDeep(root, 0);
        averageList(doubles);
        return doubles;
    }

    private void averageList(List<Double> doubles) {
        for (int i = 0; i < list.size(); i++) {
            List<Integer> list1 = list.get(i);
            double sum = 0;
            for (int j = 0; j < list1.size(); j++) {
                sum +=list1.get(j);
            }
            doubles.add(sum / list1.size());
        }
    }

    private void getListByDeep(TreeNode root, int deep) {
        if (root == null) {
            return;
        }

        if (list.size() == deep) {
            list.add(new ArrayList<>());
        }
        list.get(deep).add(root.val);

        getListByDeep(root.left, deep+1);
        getListByDeep(root.right, deep+1);
    }

429. N 叉树的层序遍历

List<List<Integer>> list = new ArrayList<>();

    public List<List<Integer>> levelOrder(Node root) {
        if (root== null) {
            return list;
        }

        getListByLevel(root, 0);
        return list;
    }

    private void getListByLevel(Node root, int deep) {
        if (root == null) {
            return;
        }

        if (list.size() == deep) {
            list.add(new ArrayList<>());
        }
        list.get(deep).add(root.val);
        List<Node> children = root.children;
        if (children == null) {
            return;
        }

        for(Node child : children) {
            getListByLevel(child, deep + 1);
        }
    }

不要被多叉树迷惑了,多叉树也只是一个遍历罢了

515. 在每个树行中找最大值

  List<List<Integer>> list = new ArrayList<>();

    public List<Integer> largestValues(TreeNode root) {
        if (root == null) {
            return new ArrayList<>();
        }
        getListByLevel(root, 0);
        return getMaxByList();
    }

    private List<Integer> getMaxByList() {
        List<Integer> maxList = new ArrayList<>(list.size());
        for (List<Integer> list1 : list) {
            Integer max = Collections.max(list1);
            maxList.add(max);
        }
        return maxList;
    }

    private void getListByLevel(TreeNode root, int deep) {
        if (root == null) {
            return;
        }

        if (list.size() == deep) {
            list.add(new ArrayList<>());
        }

        list.get(deep).add(root.val);

        getListByLevel(root.left, deep + 1);
        getListByLevel(root.right, deep + 1);
    }

116. 填充每个节点的下一个右侧节点指针 117. 填充每个节点的下一个右侧节点指针 II

public class Demo01 {

    List<Stack<Node>> list = new ArrayList<>();

    public Node connect(Node root) {
        if (root == null) {
            return root;
        }
        Node cur = root;

        connectByDepth(cur, 0);
        return root;
    }

    private void connectByDepth(Node root, int deep) {
        if (root == null) {
            return;
        }

        if (list.size() == deep) {
            list.add(new Stack<>());
//            list.get(deep).push(root);
        } else {
            Node pop = list.get(deep).pop();
            root.next = pop;
        }
        list.get(deep).push(root);

        connectByDepth(root.right, deep + 1);
        connectByDepth(root.left, deep + 1);
    }
}

class Node {
    public int val;
    public Node left;
    public Node right;
    public Node next;

    public Node() {
    }

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, Node _left, Node _right, Node _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }
}

先将右子树放入栈中,这样每一次弹出的都是右边的节点,让当前节点指向右节点即可。然后再放入当前节点。

104. 二叉树的最大深度

    private int maxDeep = 0;

    public int maxDepth(TreeNode root) {
        if (root == null) {
            return maxDeep;
        }
        getDeepByTreeNode(root, 0);
        return maxDeep;
    }

    private void getDeepByTreeNode(TreeNode root, int deep) {
        if (root == null) {
            return;
        }
    
        if (root.left == null && root.right == null) { // 根节点
            maxDeep = Math.max(deep + 1, maxDeep);
        }
    
        getDeepByTreeNode(root.left, deep + 1);
        getDeepByTreeNode(root.right, deep + 1);
    }

111. 二叉树的最小深度

 private int minDeep = Integer.MAX_VALUE;

    public int minDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        getMinDeep(root, 0);
        return minDeep;
    }

    private void getMinDeep(TreeNode root, int deep) {
        if (root == null) {
            return;
        }
        if (root.left == null && root.right == null) {
            minDeep = Math.min(minDeep, deep + 1);
        }

        getMinDeep(root.left, deep + 1);
        getMinDeep(root.right, deep + 1);
    }

226. 翻转二叉树

    public TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return root;
        }
        TreeNode right = invertTree(root.left);
        TreeNode left = invertTree(root.right);
        root.left = left;
        root.right = right;
        return root;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容