什么是二叉树的高度和深度
深度:根节点到某个节点的路径(从上往下)
高度:叶子节点到某个节点的路径(从下往上)
104.二叉树最大深度
题目链接:104. 二叉树的最大深度 - 力扣(LeetCode)
解题思路:二叉树的最大深度就等于二叉树的最大高度,所以这题能够转求二叉树的最大高度来解题。采用递归的思想,某个节点的最大高度等于他的左右孩子节点中最大高度+1,即采用后序遍历能够完成操作。
代码实现:
class Solution {
public:
int getdepth(TreeNode* node){
if(node == NULL)return 0;
int leftdepth = getdepth(node->left);
int rightdepth = getdepth(node->right);
int max_depth = 1+max(leftdepth,rightdepth);
return max_depth;
}
int maxDepth(TreeNode* root) {
return getdepth(root);
}
};
同样能够使用层序遍历来实现,即层数就是最大深度。
代码实现:
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root == NULL) return 0;
queue<TreeNode*>que;
int depth = 0;
que.push(root);
while(!que.empty()){
depth++;
int size = que.size();
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);
}
}
return depth;
}
};
111.二叉树的最小深度
题目链接:111. 二叉树的最小深度 - 力扣(LeetCode)
解题思路:这题与第一题其实相似,只是按照题目要求,当根节点的左右孩子其中一个为空的时候,最小深度不能为1,而是不为空的那个子树的最小深度+1。同样使用递归的思想就能实现。
class Solution {
public:
int getdepth(TreeNode *node){
if(node == NULL) return 0;
int leftdepth = getdepth(node->left);
int rightdepth = getdepth(node->right);
if(node->left == NULL && node->right != NULL){//左孩子为空
return 1+rightdepth;
}
if(node->right == NULL && node->left !=NULL){//右孩子为空
return 1+leftdepth;
}
int result = 1 +min(leftdepth,rightdepth);
return result;
}
int minDepth(TreeNode* root) {
return getdepth(root);
}
};
222.完全二叉树的节点个数
题目链接:222. 完全二叉树的节点个数 - 力扣(LeetCode)
解题思路:这题直接使用递归就能实现,某个总的节点数=左子树节点数+右子树节点数+1。
代码实现:
class Solution {
public:
int getnum(TreeNode* node){
if(node == NULL)return 0;
int leftnum = getnum(node->left);
int rightnum = getnum(node->right);
int total_num = leftnum + rightnum +1;
return total_num;
}
int countNodes(TreeNode* root) {
return getnum(root);
}
};
(ps:目前只掌握了有关递归的题解,其余题解后续补充)