【PHP解法==LeetCode(二叉树中的递归1)】104.二叉树的最大深度 && 111.二叉树的最小深度 && 222.完全二叉树的节点个数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010365335/article/details/87869400

二叉树有天然的递归结构,特别适合用递归去解决问题,如最常见的前中后序遍历

104.二叉树的最大深度

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

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

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

示例:
给定二叉树 [3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7

返回它的最大深度 3 。

递归:分别求得左右子树的最深高度,比较取大值即可

/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     public $val = null;
 *     public $left = null;
 *     public $right = null;
 *     function __construct($value) { $this->val = $value; }
 * }
 */
class Solution {
    function maxDepth($root) {
        if($root == null)
            return 0;
        $leftMaxLength = $this->maxDepth($root->left);		//求左子树的最大深度
        $rightMaxLength = $this->maxDepth($root->right);	//求左子树的最大深度
        return max($leftMaxLength,$rightMaxLength)+1;		//获取左右子树中较大的值,+1:加上当前节点这一层
    }
}

111.二叉树的最小深度

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

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

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

示例:

给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回它的最小深度  2.

区别:需要注意边界值的判断

class Solution {
    function minDepth($root) {
        if($root == null) return 0;   //如果参数为空,直接返回0
        if($root->left == null && $root->right == null) return 1;    //叶子节点取1
        $leftMinLength = $root->left ? $this->minDepth($root->left) : PHP_INT_MAX;
        $rightMinLength = $root->right ? $this->minDepth($root->right) : PHP_INT_MAX;
        return min($leftMinLength,$rightMinLength)+1;     //取左右子树中较小的一个
    }
}

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

给出一个完全二叉树,求出该树的节点个数。

说明:

完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

示例:

输入: 
    1
   / \
  2   3
 / \  /
4  5 6

输出: 6

分析:

(1)当空节点时,节点数为0

(2)当节点没有左孩子时,根据完全二叉树定义,该节点为叶子节点,返回1

(2)当节点没有右孩子时,根据完全二叉树定义,该节点仅有一个左孩子,返回2个节点

class Solution {
    function countNodes($root) {
        if($root == null) return 0;              //空节点
        if($root->left == null) return 1;        //叶子节点
        if($root->right == null) return 2;       //仅有1个左孩子
        return $this->countNodes($root->left) + $this->countNodes($root->right) + 1; //递归取数量
    }
}

猜你喜欢

转载自blog.csdn.net/u010365335/article/details/87869400
今日推荐