LeetCode 104. 二叉树的最大深度
解题思路
二叉树的 最大深度 是指 从根结点到最远叶子结点的最长路径上的结点数。这里区分两个概念:
- 二叉树结点的深度: 指从根结点到该结点的最长简单路径边的条数或者结点数;
- 二叉树结点的高度: 指从该结点到叶子结点的最长简单路径边的条数或者结点数;
所以根结点的高度就是二叉树的最大深度。
使用递归法可以使用前序遍历(中左右), 也可以使用后序遍历(左右中)。其中使用前序求的是深度,使用后续求得是高度。
使用后序遍历计算树的高度流程:
- 参数是传入树的根结点,返回的是这棵树的深度(int 型);
- 如果为空结点,返回0,表示高度为0;
- 递归逻辑: 先求左子树的深度,再求右子树的深度,最后取左、右深度最大的数值,并加上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 == nullptr)
return 0;
int left = getDepth(node->left);
int right = getDepth(node->right);
return 1+ max(left, right);
}
int maxDepth(TreeNode* root) {
return getDepth(root);
}
};
LeetCode 111. 二叉树的最小深度
解题思路
最小深度是指根结点到最近叶子结点的最短路径上的结点数量, 注意是叶子结点。因此本题与最大深度不同的是, 最近的叶子结点不一定在最后一层。
所以,如果左子树为空,右子树不为空,说明最小深度是 1+右子树的深度; 反之,右子树为空,左子树不为空,最小深度是 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 == nullptr)
{
return 0;
}
if(node->left !=nullptr && node->right == nullptr)
return 1+getDepth(node->left);
else if(node->left == nullptr && node->right !=nullptr)
return 1 + getDepth(node->right);
else if(node->left == nullptr && node->right == nullptr)
return 1;
int leftDepth = getDepth(node->left);
int rightDepth = getDepth(node->right);
return 1 + min(leftDepth ,rightDepth);
}
int minDepth(TreeNode* root) {
return getDepth(root);
}
};
LeetCode 104. 完全二叉树的结点个数
解题思路
本题要求该树的所有结点个数,最直观的想法应该就是使用层序遍历法, 遍历每一层并统计每个层中的结点数量。
如果使用递归法, 在单层递归逻辑中,先求左子树的结点数量,再求右子树中的结点数量,最后取总和加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 getNodes(TreeNode * node)
{
// if(node->left == nullptr && node->right == nullptr)
// {
// return 1;
// }
if(node == nullptr)
{
return 0 ;
}
return 1 + getNodes(node->left) + getNodes(node->right);
}
int countNodes(TreeNode* root) {
if(root == nullptr)
return 0;
return getNodes(root);
}
};