剑指offer 二叉树的深度

Dear 丶 2024-04-17 05:59 151阅读 0赞

剑指offer题型分类及各题的代码及解题思路

1、题目描述

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

2、初始结构定义

  1. /*
  2. struct TreeNode {
  3. int val;
  4. struct TreeNode *left;
  5. struct TreeNode *right;
  6. TreeNode(int x) :
  7. val(x), left(NULL), right(NULL) {}
  8. };*/
  9. class Solution {
  10. public:
  11. int TreeDepth(TreeNode* pRoot){}
  12. };

3、解题思路及代码

方法一:递归法

思路:

  • 如果一棵树只有一个结点,那么它的深度为1;
  • 如果一棵树根节点只有左右子树其中一个,那么树的深度为左子树深度加1或右子树深度加1;
  • 如果一棵树既有左子树又有右子树,那么深度即为左右子树深度的较大值加1;

    class Solution {
    public:

    1. int TreeDepth(TreeNode* pRoot)
    2. {
    3. if(pRoot == NULL)
    4. return 0;
    5. int left = TreeDepth(pRoot->left);
    6. int right = TreeDepth(pRoot->right);
    7. return (left > right) ? (left+1) : (right + 1);
    8. }

    };

方法二:非递归法

经典的非递归层次遍历:利用辅助队列,先将头节点入队列,当队列不空时出队列的节点记为curr,当curr左节点不空时入队列,其右节点不空时入队列,如此循环即可。

求深度:构造变量n记录当前层访问到的节点数,width记录当前层的总个数,每当访问过一层层数depth++;

此种方法同时可以求最大宽度,访问第几层的第几个节点,是一种通用方法!

  1. class Solution
  2. {
  3. public:
  4. int TreeDepth(TreeNode* pRoot)
  5. {
  6. if(pRoot == NULL)
  7. return 0;
  8. queue<TreeNode*> q; //构造辅助队列
  9. TreeNode* curr; //记录当前节点
  10. int depth = 0; //初始深度为0;
  11. int n,width; //n记录访问到当前层的第几个,widtd为当前层的宽度
  12. q.push(pRoot); //头结点入队列
  13. //队列不空 循环记录深度
  14. while(!q.empty())
  15. {
  16. //新的一层n赋为0
  17. n = 0;
  18. //当前队列里的节点即为该层的所有节点
  19. width = q.size();
  20. //循环访问该层的所有节点
  21. while(n < width)
  22. {
  23. //访问队列的头
  24. curr = q.front();
  25. q.pop(); //访问完的结点出队
  26. if(curr->left != NULL)
  27. {
  28. q.push(curr->left);
  29. }
  30. if(curr->right != NULL)
  31. {
  32. q.push(curr->right);
  33. }
  34. n++;
  35. }
  36. depth++; //访问完一层,深度加1
  37. }
  38. return depth;
  39. }
  40. };

发表评论

表情:
评论列表 (有 0 条评论,151人围观)

还没有评论,来说两句吧...

相关阅读

    相关 offer 深度

    [剑指offer题型分类及各题的代码及解题思路][offer] 1、题目描述 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树...

    相关 Offer | 深度

    一、题目 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 二、思路 (1) 递归的思想适合

    相关 offer:深度

    题目描述 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 AC C++ Solution:

    相关 Offer-深度

    题目描述 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 解题思路—使用堆栈:使用堆栈依次压入