当前位置:   article > 正文

算法练习第17天|104.二叉树的最大深度 、559.N叉树的最大深度

算法练习第17天|104.二叉树的最大深度 、559.N叉树的最大深度

 104.二叉树的最大深度

104. 二叉树的最大深度 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/maximum-depth-of-binary-tree/description/

什么是二叉树的深度和高度?

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。最大深度==二叉树的层数==根节点的深度==根节点的高度==第二层节点的最大高度+1。

二叉树某个节点的深度:指从根节点到该节点的最长简单路径边的条数。

二叉树某个节点的高度:指从该节点到叶子节点的最长简单路径边的条数。

题目描述:

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:3

示例 2:

输入:root = [1,null,2]
输出:2

思路分析:

本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。

后序递归解法

下面先尝试使用后序递归实现最大深度的求法。

递归第一步:确认递归函数的参数和返回值。题目已经给出,参数为二叉树的根节点指针,返回值为最大深度,所以返回值类型为int。

int maxDepth(TreeNode* root){}

递归第二步:确认终止条件。那就是如果传入的root为nullptr,则返回0。即递归结束的条件为空树,即没有子树可以继续下一层的递归。

if(root == nullptr) return 0;

递归第三步:确认单层递归逻辑。按照该思路,在单层递归时应该分别统计当前root(可以时根节点,也可以是子树的根节点)的左右子树的最大高度,然后取两者中的最大值。则当前root的深度为两者中的最大值+1,即:

  1. //左子树的高度
  2. int left = maxDepth(root->left);
  3. //右子树的高度
  4. int right = maxDepth(root->right);
  5. int depth = max(left, right) + 1; //中
  6. return depth;

后序整体代码如下:

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10. * };
  11. */
  12. class Solution {
  13. public:
  14. //采用后序递归遍历
  15. int maxDepth(TreeNode* root) {
  16. if(root == nullptr) return 0;
  17. //左子树的高度
  18. int left = maxDepth(root->left); //左
  19. //右子树的高度
  20. int right = maxDepth(root->right); //右
  21. int depth = max(left, right) + 1; //中
  22. return depth;
  23. }
  24. };

层序遍历解法

由于二叉树的最大深度就是二叉树的层数,所以使用前文所讲的层序遍历来计算深度(层数)。具体代码如下:

  1. class Solution {
  2. public:
  3. //采用层序遍历
  4. int maxDepth(TreeNode* root) {
  5. if(root == nullptr) return 0;
  6. queue<TreeNode*> que;
  7. que.push(root);
  8. int depth = 0;
  9. while(!que.empty())
  10. {
  11. int size= que.size();
  12. //当前层存在,深度++
  13. ++depth;
  14. //遍历当前层各节点
  15. for(int i=0; i<size; i++)
  16. {
  17. //去每一层的各节点必须放在for循环里
  18. TreeNode *node = que.front();
  19. que.pop();
  20. if(node->left) que.push(node->left);
  21. if(node->right) que.push(node->right);
  22. }
  23. }
  24. return depth;
  25. }
  26. };

前序递归解法

最后介绍一下前序解法,我理解来比较困难,大家可以看一下:

  1. class solution {
  2. public:
  3. int result;
  4. void getdepth(TreeNode* node, int depth) {
  5. result = depth > result ? depth : result; // 中
  6. if (node->left == NULL && node->right == NULL) return ;
  7. if (node->left) { // 左
  8. depth++; // 深度+1
  9. getdepth(node->left, depth);
  10. depth--; // 回溯,深度-1
  11. }
  12. if (node->right) { // 右
  13. depth++; // 深度+1
  14. getdepth(node->right, depth);
  15. depth--; // 回溯,深度-1
  16. }
  17. return ;
  18. }
  19. int maxDepth(TreeNode* root) {
  20. result = 0;
  21. if (root == NULL) return result;
  22. getdepth(root, 1);
  23. return result;
  24. }
  25. };

559.N叉树的最大深度

559. N 叉树的最大深度 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/maximum-depth-of-n-ary-tree/description/

题目描述:

给定一个 N 叉树,找到其最大深度。

最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。

N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。

示例 1:

输入:root = [1,null,3,2,4,null,5,6]
输出:3

示例 2:

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:5

有了前面二叉树的解法,下面直接给出后序递归解法:

后序递归解法

  1. /*
  2. // Definition for a Node.
  3. class Node {
  4. public:
  5. int val;
  6. vector<Node*> children;
  7. Node() {}
  8. Node(int _val) {
  9. val = _val;
  10. }
  11. Node(int _val, vector<Node*> _children) {
  12. val = _val;
  13. children = _children;
  14. }
  15. };
  16. */
  17. class Solution {
  18. public:
  19. int maxDepth(Node* root) {
  20. if(root == nullptr) return 0;
  21. int depth = 0;
  22. for(int i = 0; i < root->children.size(); ++i)
  23. {
  24. int children_i_depth = maxDepth(root->children[i]);
  25. depth = max(children_i_depth, depth) ; //注意,这里只找子树的最大高度
  26. }
  27. return depth+1; //深度是在子树最大高度的基础上加1
  28. }
  29. };

层序遍历解法:

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/460030
推荐阅读
相关标签
  

闽ICP备14008679号