力扣104 二叉树最大深度
题目描述:
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例: 给定二叉树 [3,9,20,null,null,15,7],
这里返回的是3
思路:
递归后序遍历,依次得到左右的子树的深度,取最大的然后一步步回溯到头结点然后就得出结果。
代码如下:
class Solution {
public:
int getdepth(TreeNode* root){
if(root == NULL){
return 0;
}
int leftdepth = getdepth(root->left);
int rightdepth = getdepth(root->right);
//深度是当前节点的深度加上子树的深度
int depth = 1 + max(leftdepth, rightdepth);
return depth;
}
int maxDepth(TreeNode* root) {
return getdepth(root);
}
};
力扣111 二叉树最小深度
题目描述:
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
返回它的最小深度 2
思路:
这里很容易就想要去和最大深度一样,直接去最小就是了。但是这样的话,当
根节点没有左子树或右子树时,其实它的最小深度就应该由单边决定,如果单纯的取最小的话,在这种情况下就会直接取根节点的层次即为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 rightDepth + 1;
}
if(node->right == NULL && node->left != NULL){
return leftDepth + 1;
}
int result = 1 + min(leftDepth, rightDepth);
return result;
}
int minDepth(TreeNode* root) {
return getDepth(root);
}
};
力扣222 完全二叉树的结点数
题目描述:
给出一个完全二叉树,求出该树的节点个数。
示例 1:
输入:root = [1,2,3,4,5,6]
输出:6
示例 2:
输入:root = []
输出:0
示例 3:
输入:root = [1]
输出:1
提示:
树中节点的数目范围是[0, 5 * 10^4]
0 <= Node.val <= 5 * 10^4
题目数据保证输入的树是 完全二叉树
思路:
可以用普通二叉树的做法,就一层层找当前结点的孩子个数,最后一层层向上回溯。但完全二叉树可能是满二叉树,也可能是前n-1层是满的,第n层不是满的,这两种情况分开讨论其实可以做一些剪枝,减小时间复杂度。
代码如下:
class Solution {
public:
int countNodes(TreeNode* root) {
if (root == nullptr) return 0;
TreeNode* left = root->left;
TreeNode* right = root->right;
int leftDepth = 0, rightDepth = 0; // 这里初始为0是有目的的,为了下面求指数方便
//左右深度相同了就是满二叉树,因为题目给的就是完全二叉树.
while (left) { // 求左子树深度
left = left->left;
leftDepth++;
}
while (right) { // 求右子树深度
right = right->right;
rightDepth++;
}
//如果深度相同了,根据满二叉树的特点,可以直接返回,这里做了依次剪枝,
//即不必再次进入递归。
if (leftDepth == rightDepth) {
return (2 << leftDepth) - 1; // 注意(2<<1) 相当于2^2,所以leftDepth初始为0
}
int leftTreeNum = countNodes(root->left); // 左
int rightTreeNum = countNodes(root->right); // 右
int result = leftTreeNum + rightTreeNum + 1; // 中
return result;
}
};