• 【LeetCode】【剑指offer】【二叉树的深度(一)】


    剑指 Offer 55 - I. 二叉树的深度

    输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。

    例如:

    给定二叉树 [3,9,20,null,null,15,7],

        3
       / \
      9  20
        /  \
       15   7
    返回它的最大深度 3 。

    提示:

    节点总数 <= 10000

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/er-cha-shu-de-shen-du-lcof
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

     

    我们可以采用深度优先遍历的方法,如果当前结点为nullptr就返回0,如果不是的话,就返回左子树和右子树中更深的那一棵树的深度。

    1. /**
    2. * Definition for a binary tree node.
    3. * struct TreeNode {
    4. * int val;
    5. * TreeNode *left;
    6. * TreeNode *right;
    7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    8. * };
    9. */
    10. class Solution {
    11. public:
    12. int maxDepth(TreeNode* root) {
    13. if(root==nullptr)
    14. {
    15. return 0;
    16. }
    17. //返回左子树和右子树中更深的那一棵树的深度,同时不要忘了需要+1,因为我们当前层也是一层深度
    18. return max(maxDepth(root->left),maxDepth(root->right))+1;
    19. }
    20. };

    或者采用的我们广度优先遍历的算法,先将根节点入队列,然后记录当前队列的元素个数,也就是当前层的元素个数,然后不断地将队首的元素出队,然后将队首结点的左右结点入队,直到这一层的数据全部都被遍历完成。然后让我们的统计层数的计数器++。以此循环迭代,直到队列中没有元素为止。

    1. /**
    2. * Definition for a binary tree node.
    3. * struct TreeNode {
    4. * int val;
    5. * TreeNode *left;
    6. * TreeNode *right;
    7. * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    8. * };
    9. */
    10. class Solution {
    11. public:
    12. int maxDepth(TreeNode* root) {
    13. if(root==nullptr)
    14. {
    15. return 0;
    16. }
    17. queue record;
    18. record.push(root);
    19. int result=0;
    20. while(record.empty()!=true)
    21. {
    22. //记录当前层的元素个数
    23. int size=record.size();
    24. //遍历当前层的所有元素,并且将当前层的元素的左右子树压入栈中
    25. while(size--)
    26. {
    27. TreeNode* tmp=record.front();
    28. record.pop();
    29. if(tmp->left)
    30. {
    31. record.push(tmp->left);
    32. }
    33. if(tmp->right)
    34. {
    35. record.push(tmp->right);
    36. }
    37. }
    38. //遍历完成一层,让我们的层数++
    39. result++;
    40. }
    41. return result;
    42. }
    43. };

     

    可以看到广度优先遍历在内存消耗上比深度优先遍历大得多,因为我们开辟了一个队列。并且在运行时间上也没有太大的提升。所以建议采用深度优先遍历的策略 

  • 相关阅读:
    技术分享| anyRTC服务4.3升级
    Docker无法连接到docker守护程序
    【LeetCode: 2596. 检查骑士巡视方案:深度优先搜索】
    HLS学习2:使用ARM核点灯
    SPOJ 4110 Fast Maximum Flow (最大流模板)
    【MySQL系列】Java的JDBC编程
    如何有效建立客户关系,提高复购率与客户的终生价值
    Python每日一练(牛客网新题库)——第10天:从入门到实践四十招
    数据结构--堆
    go中父协程与子协程的生命周期(子协程能否使用主协程变量)
  • 原文地址:https://blog.csdn.net/weixin_62684026/article/details/126448081