104. 二叉树的最大深度
递归法的遍历应用,bfs也行
int maxDepth(TreeNode* root) {
if(root == nullptr)
return 0;
int left = maxDepth(root->left) + 1;
int right = maxDepth(root->right) + 1;
return max(left,right);
}
111. 二叉树的最小深度
所以,如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树最小深度。
反之,右子树为空,左子树不为空,最小深度是 1 + 左子树最小深度。
最后如果左右子树都不为空,返回左右子树深度最小值 + 1 。
int minDepth(TreeNode* root) {
// 迭代
if (!root)
return 0;
int res = 0;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
int l = q.size();
res ++;
for (int i = 0; i < l; i ++ ) {
auto node = q.front();
q.pop();
if (node->left)
q.push(node->left);
if (node->right)
q.push(node->right);
if (!node->left && !node->right)
return res;
}
}
return res;
}
222.完全二叉树的节点个数
递归法利用完全二叉树的性质,在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^(h-1) 个节点
完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。
对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。
对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。
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
}
return countNodes(root->left) + countNodes(root->right) + 1;
}