• 代码随想录算法训练营第23期day15| 104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数


    目录

    一、(leetcode 104)二叉树的最大深度

    递归法(中序)

    迭代法

    相关题目:559.n叉树的最大深度

    递归法

    迭代法-层序遍历

    二、(leetcode 111)二叉树的最小深度

    三、(leetcode 222)完全二叉树的节点个数


    一、(leetcode 104)二叉树的最大深度

    力扣题目链接

    状态:递归AC,迭代套模板AC

    • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
    • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)

    根节点的高度就是二叉树的最大深度,所以用后序遍历求的根节点高度来求的二叉树最大深度

    递归法(中序)

    1. class Solution {
    2. public:
    3. int getdepth(TreeNode*node) {
    4. if(node==0) return 0;
    5. int leftdepth = getdepth(node->left); // 左
    6. int rightdepth = getdepth(node->right); // 右
    7. int depth = 1 + max(leftdepth, rightdepth); // 中
    8. return depth;
    9. }
    10. int maxDepth(TreeNode* root) {
    11. return getdepth(root);
    12. }
    13. };

    迭代法

    参照二叉树层序遍历的模板来解决

    1. class solution {
    2. public:
    3. int maxDepth(TreeNode* root) {
    4. if (root == NULL) return 0;
    5. int depth = 0;
    6. queue que;
    7. que.push(root);
    8. while(!que.empty()) {
    9. int size = que.size();
    10. depth++; // 记录深度
    11. for (int i = 0; i < size; i++) {
    12. TreeNode* node = que.front();
    13. que.pop();
    14. if (node->left) que.push(node->left);
    15. if (node->right) que.push(node->right);
    16. }
    17. }
    18. return depth;
    19. }
    20. };

    相关题目:559.n叉树的最大深度

    递归法

    1. class solution {
    2. public:
    3. int maxDepth(Node* root) {
    4. if (root == 0) return 0;
    5. int depth = 0;
    6. for (int i = 0; i < root->children.size(); i++) {
    7. depth = max (depth, maxDepth(root->children[i]));
    8. }
    9. return depth + 1;
    10. }
    11. };

    迭代法-层序遍历

    1. class solution {
    2. public:
    3. int maxDepth(Node* root) {
    4. queue que;
    5. if (root != NULL) que.push(root);
    6. int depth = 0;
    7. while (!que.empty()) {
    8. int size = que.size();
    9. depth++; // 记录深度
    10. for (int i = 0; i < size; i++) {
    11. Node* node = que.front();
    12. que.pop();
    13. for (int j = 0; j < node->children.size(); j++) {
    14. if (node->children[j]) que.push(node->children[j]);
    15. }
    16. }
    17. }
    18. return depth;
    19. }
    20. };

    二、(leetcode 111)二叉树的最小深度

    力扣题目链接

    状态:递归AC,迭代没来得及做,需要注意

    虽然看上去和最大深度类似,但是需要加入对节点是否是叶子节点的判断(左右孩子为空)。

     

    1. class Solution {
    2. public:
    3. int getDepth(TreeNode* node) {
    4. if (node == NULL) return 0;
    5. int leftDepth = getDepth(node->left); // 左
    6. int rightDepth = getDepth(node->right); // 右
    7. // 中
    8. // 当一个左子树为空,右不为空,这时并不是最低点
    9. if (node->left == NULL && node->right != NULL) {
    10. return 1 + rightDepth;
    11. }
    12. // 当一个右子树为空,左不为空,这时并不是最低点
    13. if (node->left != NULL && node->right == NULL) {
    14. return 1 + leftDepth;
    15. }
    16. int result = 1 + min(leftDepth, rightDepth);
    17. return result;
    18. }
    19. int minDepth(TreeNode* root) {
    20. return getDepth(root);
    21. }
    22. };

    三、(leetcode 222)完全二叉树的节点个数

    力扣题目链接

    状态:递归AC,但是没有借助完全二叉树这一概念,所以还有改进的空间

     迭代就是层序的时候每次出队列记录一下,递归和前面几题类似,也是后序遍历顺序

    1. class Solution {
    2. private:
    3. int getNodesNum(TreeNode* cur) {
    4. if (cur == NULL) return 0;
    5. int leftNum = getNodesNum(cur->left); // 左
    6. int rightNum = getNodesNum(cur->right); // 右
    7. int treeNum = leftNum + rightNum + 1; // 中
    8. return treeNum;
    9. }
    10. public:
    11. int countNodes(TreeNode* root) {
    12. return getNodesNum(root);
    13. }
    14. };

  • 相关阅读:
    极致CMS翻译插件自动批量多语种翻译
    部署安装yapi
    linux防火墙查看状态firewall、iptable
    企业微信知识库:从了解到搭建的全流程
    Java方法参数传递的底层分析
    MySQL索引
    977. 有序数组的平方
    Java高阶数据结构之红黑树
    Python爬虫之Scrapy框架(案例练习)
    2. redis常见数据类型
  • 原文地址:https://blog.csdn.net/weixin_42179093/article/details/133656640