求二叉树的最大深度

二叉树的最大深度即二叉树的高度,一般有两个解法,第一种是递归,代码简单,但不太好理解。第二种是使用层序遍历的方式,记录每层的节点数,遍历完一层,层数计数器加一。

 

一、递归

想要求一颗二叉树的高度,即求孩子节点的最大深度,要么是左孩子,要么是右孩子,那么我们只需要对传入的孩子节点递归调用即可。

 /**
     * 求二叉树的深度(使用递归)
     *
     * @param root
     * @return
     */
    public int getHeight(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftHeight = getHeight(root.getLeft());
        int rightHeight = getHeight(root.getRight());
        return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
    }

 

 

二、使用层序遍历

通过记录本层元素总数、本层已经访问过的元素,层数计数器来获得二叉树的高度,此中方法也可以获得二叉树的最大宽度。使用这种方式,灵活度比较高。

 /**
     * 求二叉树的深度(不使用递归)
     *
     * @param root
     * @return
     */
    public int getHeight2(TreeNode root) {
        if (root == null) {
            return 0;
        }
        LinkedList<TreeNode> list = new LinkedList<>();
        list.offer(root);
        //最大宽度留备用
        int max=0;
        //二叉树的深度
        int level = 0;
        //本层中元素总数
        int size = 0;
        //本层已经访问过的元素个数
        int cur = 0;
        while (!list.isEmpty()) {
            size = list.size();
            max=Math.max(max,size);
            cur = 0;
            while (cur < size) {
                TreeNode node = list.poll();
                cur++;
                if (node.getLeft() != null) {
                    list.offer(node.getLeft());
                }
                if (node.getRight() != null) {
                    list.offer(node.getRight());
                }
            }
            level++;
        }
        System.out.println("二叉树最大宽度为:"+max);
        return level;
    }