文章讲解:代码随想录 (programmercarl.com)
题目链接:104. 二叉树的最大深度 - 力扣(LeetCode)
视频讲解::二叉树的高度和深度有啥区别?究竟用什么遍历顺序?很多录友搞不懂 | 104.二叉树的最大深度
题目: 给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
思路:
后序遍历(左右中)
int getdepth(treenode* node)
if (node == NULL) return 0;
int leftdepth = getdepth(node->left); // 左
int rightdepth = getdepth(node->right); // 右
int depth = 1 + max(leftdepth, rightdepth); // 中
return depth;
前序遍历(中左右)
class solution {
public:
int result;
void getdepth(treenode* node, int depth) {
result = depth > result ? depth : result; // 中
if (node->left == NULL && node->right == NULL) return ;
if (node->left) { // 左
depth++; // 深度+1
getdepth(node->left, depth);
depth--; // 回溯,深度-1
}
if (node->right) { // 右
depth++; // 深度+1
getdepth(node->right, depth);
depth--; // 回溯,深度-1
}
return ;
}
int maxdepth(treenode* root) {
result = 0;
if (root == NULL) return result;
getdepth(root, 1);
return result;
}
};
前序遍历
class Solution {
public:
int result;
void getDepth (Node* cur, int depth) {
result = depth > result ? depth : result;
if (cur->children.size() == 0) return;
for (int i = 0; i < cur->children.size(); i++) {
depth++;
getDepth(cur->children[i], depth);
depth--;
}
return;
}
int maxDepth(Node* root) {
result = 0;
if (root != NULL) getDepth(root, 1);
return result;
}
};
后序遍历
class Solution {
public:
int getDepth(Node* cur) {
if (cur == NULL) return 0;
int depth = 0;
for (int i = 0; i < cur->children.size(); i++) {
depth = max(depth, getDepth(cur->children[i]));
}
return depth + 1;
}
int maxDepth(Node* root) {
return getDepth(root);
}
};
文章讲解:代码随想录 (programmercarl.com)
题目链接:111. 二叉树的最小深度 - 力扣(LeetCode)
视频讲解:看起来好像做过,一写就错! | LeetCode:111.二叉树的最小深度
题目: 给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
**说明:**叶子节点是指没有子节点的节点。
后序遍历
比较左右子树的高度
最小深度:左右子树最小的高度 + 1【注意:若没有左/右子树,不能0 + 1】
class Solution {
public:
int getMin (TreeNode* cur) {
if (cur == NULL) return 0;
int leftDepth = getMin(cur->left);
int rightDepth = getMin(cur->right);
if (cur->left && !cur->right) return leftDepth + 1;
if (!cur->left && cur->right) return rightDepth + 1;
int result = 1 + min(leftDepth, rightDepth);
return result;
}
int minDepth(TreeNode* root) {
return getMin(root);
}
};
前序遍历
计算每一层的深度
最小深度:比较每个叶子节点的深度
class Solution {
public:
int result;
void getMin (TreeNode* cur, int depth) {
if (!cur->left && !cur->right) {
result = min(depth, result);
return;
}
if (cur->left) {
depth++;
getMin(cur->left, depth);
depth--;
}
if (cur->right) {
depth++;
getMin(cur->right, depth);
depth--;
}
return;
}
int minDepth(TreeNode* root) {
if (root == NULL) return 0;
result = INT_MAX;
getMin(root, 1);
return result;
}
};
文章讲解:代码随想录 (programmercarl.com)
视频讲解:要理解普通二叉树和完全二叉树的区别! | LeetCode:222.完全二叉树节点的数量
题目链接:222. 完全二叉树的节点个数 - 力扣(LeetCode)
题目: 给出一个完全二叉树,求出该树的节点个数。
class Solution {
public:
int cout (TreeNode* cur) {
int leftDepth = 0;
int rightDepth = 0;
TreeNode* left = cur->left;
TreeNode* right = cur->right;
while (left) {
leftDepth++;
left = left->left;
}
while (right) {
rightDepth++;
right = right->right;
}
if (leftDepth == rightDepth) return (2 << leftDepth) - 1;
int leftCount = 0;
int rightCount = 0;
if (cur->left) leftCount = cout(cur->left);
if (cur->right) rightCount = cout(cur->right);
int count = leftCount + rightCount + 1;
return count;
}
int countNodes(TreeNode* root) {
if (root == NULL) return 0;
return cout(root);
}
};