版权声明:本文为博主原创文章,未经博主允许不得转载。 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; //递归取数量
}
}