题目要求
给定一个二叉树,求其最大深度。
最大深度:从根结点到叶子结点包含的节点的最大个数。
注意: 叶子结点说的是一个没有孩子的节点。
输入示例
Example:输入一个二叉树 [3,9,20,null,null,15,7],3/ \9 20/ \15 7
return its depth = 3.
解题思路
1、用深度优先遍历(DFS)
根据深度优先遍历的思想,我们可以先遍历到根节点左右子树的叶子结点,然后比较左右子树的最大深度,取最大的即可。需要注意的是,最后答案不要忘记加上根节点(代码中的+1操作),DFS的思想和实现都非常简单,直接看一下代码:
DFS 主要代码 c++
class Solution {
public:int maxDepth(TreeNode* root) {
if(root == NULL) return 0;return max (1+maxDepth(root->left), 1+maxDepth(root->right));}
};
2、用广度优先遍历(BFS)
主要说说BFS的实现,实际上二叉树的最大深度就是树的层数,依靠这个关系我们可以借助队列进行层序遍历,最后的层数就是题目中要求的最大深度。
具体实现的时候,我们对每一层进行如下操作:将根结点放入队列,然后对队列里的每个元素执行------弹出队列首元素---------放入其对应的孩子节点(如果有的话,为了对下一层进行遍历)---------每执行一层,层数+1。
BFS 主要代码 c++
class Solution {
public:int maxDepth(TreeNode *root){
if(root == NULL)return 0;int res = 0; // 标记高度最大值queue<TreeNode *> q;q.push(root);while(!q.empty())// 迭代操作标志{
++ res; // 每执行一层,深度+1。for(int i = 0, n = q.size(); i < n; ++ i) //对队列里的每个元素进行操作。{
TreeNode *p = q.front(); // 具体的队列操作是q.pop(); // 弹出根节点,然后放入孩子节点(如果有)if(p -> left != NULL)q.push(p -> left);if(p -> right != NULL)q.push(p -> right);}}return res;}
};
python 双边队列解法
class Solution(object):def maxDepth(self, root):""":type root: TreeNode:rtype: int"""if not root:return 0dp = collections.deque([(root,1),])while dp:cur, count = dp.popleft()if cur.left:dp.append((cur.left,count+1))if cur.right:dp.append((cur.right, count+1))return count
总结
对于求树的深度的问题,一般情况下,我们可以用递归,非递归两种方法来求解,大都数情况下,结合DFS的思想可以很简单的写出递归的方案,但是合理利用队列进行层序遍历,也是一种十分高效的手段,并且代码也并不是很难理解,建议两个方法互相结合着看,推荐掌握BFS 非递归的方法,毕竟多熟悉熟悉队列的操作也没坏处~
最后不要忘记树是空的情况哦!!!。