开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情
题目描述
给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。
//示例
3
/ \
9 20
/ \
15 7
//输出 3
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
(一)递归实现
二叉树遍历,通常用递归。递归方法,只需在乎两点:1.输入的是什么 2. 输出的是什么 例如在此题中,输入的是根节点,输出最大深度,因此,只需依次计算左子树的最大深度和右子树的最大深度。整棵树的最大深度=max(左子树最大深度+1,右子树最大深度+1),+1是加上根节点所占的那层
代码实现
int maxDepth(TreeNode^ root){
//依次往下遍历,当遍历到叶子节点的子节点时,函数返回空,由于返回时进行+1,所以以叶子节点为根节点的子树的最大深度是1,此时叶子节点作为子树,最大深度是1,则对于叶子节点的父亲节点,最大深度=1+1=2,依次向上累加,直到到达根节点的子树
if(root==null) return 0;
else return max(maxDepth(root->right)+1,maxDepth(root->left)+1);
}
(二)广度优先遍历(层序遍历)
使用队列来保存节点,就一层一层遍历,每次遍历完一层的节点,深度+1就好了。遍历到最后一层的深度就是最大深度。
代码实现
class Solution {
public:
int maxDepth(TreeNode* root) {
//便于广度优先遍历,队列中存储的是一层的节点数
queue<TreeNode*> list;
//记录深度
int depth=0;
//当根节点是空时
if(root==nullptr) return 0;
//当根节点不为空时,先将根节点入队列
list.push(root);
//当队列不为空时
while(!list.empty()){
//深度+1,加的是根节点的那一层
depth++;
//获取队列中节点的数目
int num=list.size();
//循环结束,代表一层访问结束
for(int i=0;i<num;i++){
//定义一个指针指向队列的第一个节点
TreeNode*q=list.front();
//队列采用先出队列,再访问策略
//出队
list.pop();
//访问,当当前节点的左节点不为空时,将左节点入队
if(q->left) list.push(q->left);
if(q->right) list.push(q->right);
}
}
return depth;
}
};