104. 二叉树的最大深度
对于本题而言,我们要理解什么是二叉树的最大深度,最大深度是指从根节点到最远叶子节点的最长路径上的节点数。
既然是求其最大深度,那么我们就要遍历二叉树,就可采用递归遍历的方式来遍历二叉树;确定了是递归遍历,我们又应该思考,用哪种遍历方式来遍历二叉树(前中后序遍历):
如果使用前序遍历,那么我们求得的将是深度
如果使用后序遍历,那么我们求得的将是高度
深度和高度的区别可以理解为“坐标原点”不同,深度的坐标原点在树的根节点,高度的坐标原点在树中离根节点最远的叶子节点。但是本质上来说,求得了高度也就求得了深度。
简单捋了一下思路,现在我们来思考递归应该如何写,根据我的上一篇文章对递归的讲解,我们可把递归分成三步来思考,分别是:
1.确定函数参数和确定函数返回值类型
2.确定终止条件
3.确定单层递归的逻辑
我们一步步来:
第一步:确定函数参数和确定函数返回值类型
求最大深度,返回值当然是int 型,传入的函数参数先暂定为TreeNode* root,如果后面有需要再添加
第二步:确定终止条件
终止条件很简单,当遍历到空节点的时候返回0即可
第三步:确定单层递归的逻辑
确定单层逻辑
取得左子树的深度//左
取得右子树的深度//右
找到左右两边的最大深度,然后再+1(当前的中间节点)//中
代码如下:
int leftdepth = getdepth(node->left); // 左
int rightdepth = getdepth(node->right); // 右
int depth = 1 + max(leftdepth, rightdepth); // 中
return depth;
完整代码如下:
class solution {
public:
int getdepth(TreeNode* node) {
if (node == NULL) return 0;
int leftdepth = getdepth(node->left); // 左
int rightdepth = getdepth(node->right); // 右
int depth = 1 + max(leftdepth, rightdepth); // 中
return depth;
}
int maxDepth(TreeNode* root) {
return getdepth(root);
}
};
111. 二叉树的最小深度
对于这道题目,要注意与上一题的“二叉树的最大深度”加以区别,上一道题,可以直接用max函数来去左右俩子树的最大深度,但是如果用同样的方法来解这题,使用min函数的话就会掉入陷阱,为什么?大家思考一下,万一左子树是NULL,而右子树是有深度的呢,那么最小深度就是1了,但答案明显不是1
根据递归三部曲,我们先确定函数返回值为int型,函数参数为TreeNode* node,终止条件当然是遍历到空节点的时候,那么对于单层递归函数的逻辑我们应该怎么写呢???
先取得左子树的最小深度//左
再取得右子树的最小深度//右
最后我们判断左右子树是否分别为空:
如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度,
反之,若右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。
具体代码如下
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int getdepth(TreeNode* node){
if(node==NULL) return 0;
int leftdep=getdepth(node->left);//左
int rightdep=getdepth(node->right);//右
//中
if(node->left==NULL&&node->right!=NULL){
return rightdep+1;
}
if(node->left!=NULL&&node->right==NULL){
return leftdep+1;
}
return 1+min(leftdep,rightdep);
}
int minDepth(TreeNode* root) {
if(root==NULL) return 0;
return getdepth(root);
}
};
222. 完全二叉树的节点个数
本题是求完全二叉树的节点个数
也是遍历二叉树,上递归三部曲!
确定函数返回类型为int 型,函数参数暂定为TreeNode* root,确定终止条件为遍历到空节点时返回0,单层递归的逻辑为:
确定左子树的节点个数//左
确定右子树的节点个数//右
将左右子树的节点数相加再+1(当前的中间节点)//中
返回
具体代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int func_count(TreeNode* node){
if(node==NULL) return 0;
int leftnum=func_count(node->left);//左
int rightnum=func_count(node->right);//右
int result=leftnum+rightnum+1;//中
return result;
}
int countNodes(TreeNode* root) {
return func_count(root);
}
};