给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
返回它的最大深度 3 。
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ /* 算法思想: 我们知道,树可以以递归的方式定义为一个节点(根节点),它包括一个值和一个指向其他节点指针的列表。 递归是树的特性之一。 因此,许多树问题可以通过递归的方式来解决。 对于每个递归层级,我们只能关注单个节点内的问题,并通过递归调用函数来解决其子节点问题。通常,我们可以通过 “自顶向下” 或 “自底向上” 的递归来解决树问题。 “自顶向下” 意味着在每个递归层级,我们将首先访问节点来计算一些值,并在递归调用函数时将这些值传递到子节点。 所以 “自顶向下” 的解决方案可以被认为是一种前序遍历。 我们知道根节点的深度是1。 对于每个节点,如果我们知道某节点的深度,那我们将知道它子节点的深度。 因此,在调用递归函数的时候,将节点的深度传递为一个参数,那么所有的节点都知道它们自身的深度。 而对于叶节点,我们可以通过更新深度从而获取最终答案。 */ //算法实现: /* int answer; // don't forget to initialize answer before call maximum_depth void maximum_depth(TreeNode* root, int depth) { if (!root) { return; } if (!root->left && !root->right) { answer = max(answer, depth); } maximum_depth(root->left, depth + 1); maximum_depth(root->right, depth + 1); } */ /* 算法思想: “自底向上” 是另一种递归方法。 在每个递归层次上,我们首先对所有子节点递归地调用函数,然后根据返回值和根节点本身的值得到答案。 这个过程可以看作是后序遍历的一种。 */ //算法实现: /* class Solution { public: int maxDepth(TreeNode* root) { if (!root) { return 0; } int left_depth = maxDepth(root->left); int right_depth = maxDepth(root->right); return max(left_depth, right_depth) + 1; } }; */ /* 算法思想: 也可以使用层序遍历二叉树,然后计数总层数,即为二叉树的最大深度。 */ //算法实现: class Solution { public: int maxDepth(TreeNode* root) { if (!root) return 0; int res = 0; queue<TreeNode*> q; q.push(root); while (!q.empty()) { ++res; //遍历一层结果+1 int n = q.size(); for (int i = 0; i < n; ++i) { //遍历每一层 TreeNode *t = q.front(); q.pop(); if (t->left) q.push(t->left); if (t->right) q.push(t->right); } } return res; } };