题目地址

我的解法

    /**     * 2ms 21.07     * 41M 33.17     * 其实是广度优先搜寻     * 切入点是一层一层看,依据以后层构建下一层。     * */    public static int maxDepth(TreeNode root) {        if (null == root) {            return 0;        }        int deep = 1;        List<TreeNode> curLevel = new ArrayList<>();        curLevel.add(root);        List<TreeNode> nextLevel = null;        while (hasNextLevel(curLevel)) {            nextLevel = new ArrayList<>();            for (TreeNode cur : curLevel) {                if (null != cur) {                    nextLevel.add(cur.left);                    nextLevel.add(cur.right);                }            }            curLevel = nextLevel;            deep ++;        }        return deep;    }

官网-广度优先搜寻

    /**     * 官网的广度优先搜寻     * 使用了Queue @see MyQueue     * */    public static int maxDepth_l1(TreeNode root) {        if (null == root) {            return 0;        }        Queue<TreeNode> curLevel = new LinkedList<>();        curLevel.offer(root);        int deep = 0;        while (!curLevel.isEmpty()) {            int size = curLevel.size();//TODO 固定poll次数            while (size > 0) {                TreeNode curNode = curLevel.poll();                if (curNode == null) {                    continue;                }                if (curNode.left != null) {                    curLevel.offer(curNode.left);                }                if (curNode.right != null) {                    curLevel.offer(curNode.right);                }                size --;            }//            Queue<TreeNode> curLevelTemp  = curLevel;//            for (TreeNode cur : curLevelTemp) {java.util.ConcurrentModificationException//                if (cur == null) {//                    continue;//                }//                if (cur.left != null) {//                    curLevel.offer(cur.left);//                }//                if (cur.right != null) {//                    curLevel.offer(cur.right);//                }//                curLevel.poll();//            }            deep ++;        }        return deep;    }

官网-深度优先搜寻

    /**     * 官网深度优先搜寻     * 使用递归     * 如果咱们晓得了左子树和右子树的最大深度 l 和 r,那么该二叉树的最大深度即为     *     * max(l,r) + 1     *     * 而左子树和右子树的最大深度又能够以同样的形式进行计算。     * */    public static int maxDepth_l2(TreeNode root) {        //    3        //   / \        //  9  20        //    /  \        //   15   7        if (root == null) {            return 0;        } else {            int maxLeft = maxDepth_l2(root.left);//1            int maxRight = maxDepth_l2(root.right);            return Math.max(maxLeft, maxRight) + 1;        }    }

拓展-DFS&BFS

深度优先搜索算法DFS

1、算法步骤:
——拜访顶点v;
——顺次从v的未被拜访的邻接点登程,对图进行深度优先遍历;直至图中和v有门路相通的顶点都被拜访;
——若此时图中尚有顶点未被拜访,则从一个未被拜访的顶点登程,从新进行深度优先遍历,直到图中所有顶点均被拜访过为止
2、DFS属于自觉搜寻。深度优先搜寻是图论中的经典算法,利用深度优先搜索算法能够产生指标图的相应拓扑排序表,利用拓扑排序表能够不便的解决很多相干的图论问题,如最大门路问题等等。个别用堆数据结构来辅助实现DFS算法。

广度优先搜索算法BFS

1、算法步骤:
——首先将根节点放入队列中;
——从队列中取出第一个节点,并测验它是否为指标。如果找到指标,则完结搜查并回传后果。否则将它所有尚未测验过的间接子节点退出队列中;
——若队列为空,示意整张图都查看过了——亦即图中没有欲搜查的指标。完结搜查并回传“找不到指标”;
——反复步骤2
2、BFS同样属于自觉搜寻。简略的说,BFS是从根节点开始,沿着树(图)的宽度遍历树(图)的节点。如果所有节点均被拜访,则算法停止。个别用队列数据结构来辅助实现BFS算法。

拓展API-Queue

个性

1、线性表/线性队列
2、FIFO
3、表头出,表尾加

implements

        Queue<String> queue_ArrayBlockingQueue = new ArrayBlockingQueue<>(10);        Queue<String> queue_ArrayDeque = new ArrayDeque<>();        Queue<String> queue_ConcurrentLinkedDeque = new ConcurrentLinkedDeque<>();        Queue<String> queue_LinkedBlockingDeque = new LinkedBlockingDeque<>();        Queue<String> queue_LinkedList = new LinkedList<>();

methods

method个性
add队列尾插入,队列满时抛出IllegalStateException
offer队列尾插入,队列满时返回false
remove移除并返回头部元素,队列空时,抛出NoSuchElementException
pool移除并返回头部元素,队列空时,返回null
element查看队列头元素,队列空时,抛出NoSuchElementException
peek查看队列头元素,队列空时,返回null

code

    public static void main(String[] args) {        Queue<String> queue_ArrayBlockingQueue = new ArrayBlockingQueue<>(10);        Queue<String> queue_ArrayDeque = new ArrayDeque<>();        Queue<String> queue_ConcurrentLinkedDeque = new ConcurrentLinkedDeque<>();        Queue<String> queue_LinkedBlockingDeque = new LinkedBlockingDeque<>();        Queue<String> queue_LinkedList = new LinkedList<>();        System.out.println("++++++++++++++++++++++++++");        //add 表尾插 ——>[1,2,3]        //队列满时,抛出IllegalStateException        Queue<Integer> queue_add = new ArrayBlockingQueue<>(2);        queue_add.add(1);        queue_add.add(2);        try {            queue_add.add(3);        } catch (Exception e) {            System.out.println(e);        }        for (Integer q : queue_add) {            System.out.println(q);        }        try {            Queue<Integer> queue_LinkedList_add = new LinkedList<>();            for (int i = 0; i < 1000000; i++) {                queue_LinkedList_add.add(i);            }            System.out.println(queue_LinkedList_add.size());        } catch (Exception e) {            System.out.println(e);        }        System.out.println("++++++++++++++++++++++++++");        //offer 表尾插 ——>[1,2,3,4,5,6]        //队列满时,返回false        Queue<Integer> queue_offer = new ArrayBlockingQueue<>(4);        System.out.println(queue_offer.offer(1));        System.out.println(queue_offer.offer(2));        System.out.println(queue_offer.offer(3));        System.out.println(queue_offer.offer(4));        try {            System.out.println(queue_offer.offer(5));        } catch (Exception e) {            System.out.println(e);        }        for (Integer q : queue_offer) {            System.out.println(q);        }        try {            Queue<Integer> queue_LinkedList_offer = new LinkedList<>();            for (int i = 0; i < 1000000; i++) {                if (!queue_LinkedList_offer.add(i)) {                    System.out.println("offer false");                }            }            System.out.println(queue_LinkedList_offer.size());        } catch (Exception e) {            System.out.println(e);        }        System.out.println("++++++++++++++++++++++++++");        //remove 移除并返回队列头部元素        //队列空时,抛出NoSuchElementException        Queue<Integer> queue_LinkedList_remove = new LinkedList<>();        for (int i = 0; i < 6; i++) {            queue_LinkedList_remove.offer(i);        }        for (int i = 0; i < 7; i++) {            try {                System.out.println(queue_LinkedList_remove.remove());            } catch (Exception e) {                System.out.println(i + " e = " + e);            }        }        System.out.println("++++++++++++++++++++++++++");        //poll 移除并返回队列头部元素        //队列空时,返回null        Queue<Integer> queue_poll = new LinkedList<>();        for (int i = 0; i < 10; i++) {            queue_poll.offer(i);        }        for (int i = 0; i < 11; i++) {            try {                System.out.println(queue_poll.poll());            } catch (Exception e) {                System.out.println(i + " e = " + e);            }        }        System.out.println("++++++++++++++++++++++++++");        //element 返回队列头部元素        //队列空时,抛出NoSuchElementException        Queue<Integer> queue_element = new LinkedList<>();        queue_element.offer(1);        queue_element.offer(2);        System.out.println(queue_element.element());        System.out.println(queue_element.poll());        System.out.println(queue_element.element());        System.out.println(queue_element.poll());        try {            System.out.println(queue_element.element());        } catch (Exception e) {            System.out.println(e);        }        System.out.println("++++++++++++++++++++++++++");        //peek 返回队列头部元素        //队列空时,返回null        Queue<Integer> queue_peek = new LinkedList<>();        for (int i = 0; i < 3; i++) {            queue_peek.offer(i);        }        for (int i = 0; i < 4; i++) {            try {                System.out.println(queue_peek.peek());                System.out.println(queue_peek.poll());            } catch (Exception e) {                System.out.println(i + " e = " + e);            }        }        System.out.println("++++++++++++++++++++++++++");    }