day16算法题
104.二叉树的最大深度 (优先掌握递归)
什么是深度,什么是高度,如何求深度,如何求高度,这里有关系到二叉树的遍历方式。
大家 要先看视频讲解,就知道以上我说的内容了,很多录友刷过这道题,但理解的还不够。
题目链接/文章讲解/视频讲解: programmercarl.com/0104.%E4%BA…
思路: 根节点的高度即为二叉树的深度。
class Solution {
public:
int geetdeepth(TreeNode* node)
{
if(node==NULL) return 0;
int leftDeepth=geetdeepth(node->left); //左
int rightDeepth = geetdeepth(node->right); //右
int deepth = 1 + max(leftDeepth,rightDeepth);//中
return deepth;
}
int maxDepth(TreeNode* root) {
return geetdeepth(root);
}
};
111.二叉树的最小深度 (优先掌握递归)
先看视频讲解,和最大深度 看似差不多,其实 差距还挺大,有坑。
题目链接/文章讲解/视频讲解:programmercarl.com/0111.%E4%BA…
思路: 求二叉树的最小深度和求二叉树的最大深度的差别主要在于处理左右孩子不为空的逻辑。 注意二叉树的最小深度为根节点到叶子节点的最小路径长度。
class Solution {
public:
int geetdeepth(TreeNode* node)
{
if(node==NULL) return 0;
int leftDeepth=geetdeepth(node->left); //左
int rightDeepth = geetdeepth(node->right); //右
if(node->left&&!node->right) return 1+leftDeerth;
if(!node->left&&node->right) return 1+rightDeerth;
int deepth = 1 + min(leftDeepth,rightDeepth);//中
return deepth;
}
int minDepth(TreeNode* root) {
return geetdeepth(root);
}
};
递归
class Solution {
public:
int minDepth(TreeNode* root) {
if(!root) return 0;
queue<TreeNode*> que;
int deepth = 0;
que.push(root);
while(!que.empty()){
int size = que.size();
deepth++;
for(int i=0;i<size;i++)
{
TreeNode *node = que.front();
que.pop();
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
if(!node->left&&!node->right) return deepth;
}
}
return deepth;
}
};
迭代
222.完全二叉树的节点个数(优先掌握递归)
需要了解,普通二叉树 怎么求,完全二叉树又怎么求
题目链接/文章讲解/视频讲解:programmercarl.com/0222.%E5%AE…
思路: 在完全二叉树中,如果节点是满(最左节点的深度等于最右节点的深度)的,那么节点数等于2^deepth-1(deepth为二叉树的深度),但如果节点不为满,则需要重新进行考虑,其节点的子树最终为满二叉树,可以通过递归分治的做法,求其子树的节点个数,最后在相加起来。
/**
* 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 countNodes(TreeNode* root) {
if(!root) return 0;
TreeNode* left = root->left;
TreeNode* right = root->right;
int leftDeepth =0;
int rightDeeprh =0;
while(left)
{
left=left->left;
leftDeepth++;
}
while(right)
{
right=right->right;
rightDeeprh++;
}
if(leftDeepth==rightDeeprh)
{
return (2<<leftDeepth) -1;
}
return countNodes(root->left) + countNodes(root->right) +1;
}
};