Day 15 | 104. 二叉树的最大深度 & 111. 二叉树的最小深度 & 559. N 叉树的最大深度 & 222. 完全二叉树的节点个数(不会做)

104. 二叉树的最大深度

首先明确深度和高度的概念。

深度:结点到根节点的距离。(前序遍历)

高度:结点到叶子结点的距离。(后序遍历)

二叉树根节点的高度即为叶节点的最大深度。本题思路即为后序遍历求出二叉树根节点的高度。

后序遍历递归求高度:

         递归三要素:

  1. 确定递归函数的参数和返回值: 根节点作为参数,返回值为当前结点的高度+1。

  2. 确定终止条件:当遍历到空节点时,说明当前节点高度为0,返回0.

  3. 确定单层递归的逻辑:后序遍历,遍历完左右子树后,返回给根节点。

    public int maxDepth(TreeNode root) {        
        if(root==null){return 0;}  //遍历到空节点了,该节点高度为0,返回0
        int leftHeight=maxDepth(root.left);    //左
        int rightHeight=maxDepth(root.right);  //右
        int height=1+Math.max(leftHeight,rightHeight); //中(因为是根节点所以需+1)
        return height;
}

精简写法:

    public int maxDepth(TreeNode root) {
        if(root==null){return 0;}
        return 1+Math.max(maxDepth(root.left),maxDepth(root.right));
    }

111. 二叉树的最小深度

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

后序遍历递归求高度:

注意:题目要求的最小深度为根节点到叶节点。因此当根节点没有左或右其中一个子树时,最小深度不为1,而是有子树的叶子结点到根节点的深度。

因此不能直接从最大深度那道题中将max改成min求解,而是要先判断根节点是否有子树的情况。然后再取左右子树的最小值即可。

    public int minDepth(TreeNode root) {
        if(root==null){return 0;}
        int leftHeight=minDepth(root.left);
        int rightHeight=minDepth(root.right);
        if(root.left==null&&root.right!=null){
            return rightHeight+1;
        }
        if(root.right==null&&root.left!=null){
            return leftHeight+1;
        }
        return Math.min(leftHeight,rightHeight)+1;
    }

559. N 叉树的最大深度


输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:5

Day 15 | 104. 二叉树的最大深度 & 111. 二叉树的最小深度 & 559. N 叉树的最大深度 & 222. 完全二叉树的节点个数(不会做)_第1张图片

 递归遍历:

利用递归遍历根节点每个孩子的深度,最后求最大值加一即可。

我看答案可以看懂,但是我要是自己写肯定写不出来,感觉自己对递归了解的很不清晰。。需要再多学习一下递归

   public int maxDepth(Node root) {
        if(root==null){return 0;}
        List children=root.children;
        int max=0;
        for(Node child:children){
            int depth=maxDepth(child);
            max=Math.max(max,depth);
        }
        return max+1;
    }

222. 完全二叉树的节点个数

这道题可以求出非完全二叉树节点个数,但利用完全二叉树性质可以求出更优解,但我没看懂。。还有位运算。。我很懵。。我递归真的。。T^T哭了。。要补一下递归。。

普通二叉树求节点个数:

class Solution {
    public int countNodes(TreeNode root) {
        if(root == null) return 0;
        return countNodes(root.left) + countNodes(root.right) + 1;
    }
}

你可能感兴趣的:(算法,数据结构,图论)