题目:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。
数据范围:节点的数量满足 0 ≤ n ≤ 100 ,节点上的值满足 0 ≤ val ≤ 100
这是一道典型的BFS题目,我们直接套模板就可以做出来啦
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
int TreeDepth(TreeNode* pRoot) {
//首先是几乎每道题都要出现的特殊情况检测
if(!pRoot) return 0;
queue <TreeNode *> q;
q.push(pRoot); //先把根节点存到队列中 利用队列FIFO的特性
//一层一层地往下遍历 队列中存的是还未遍历的node
int depth = 0; //初始化深度为0
while(!q.empty()){ //当q不为空 也就是存在还未遍历的node
int sz = q.size(); //sz是当前遍历的这一层的节点数
while(sz--){ //依次对每个节点进行遍历
auto node = q.front(); q.pop(); //这是队列的基本操作 看不懂的乖乖回去复习功课!
if(node->left) q.push(node->left); //将下一层的节点都存进队列中
if(node->right) q.push(node->right);
}
depth++; //最后depth++直到队列为空
}
return depth;
}
};
最后献上BFS的两个模板
// 不需要知道深度的
void bfs() {
vis[] = 0;
queue<int> pq(start_val);
while (!pq.empty()) {
int cur = pq.front(); pq.pop();
for (遍历cur所有的相邻节点nex) {
if (nex节点有效 && vis[nex]==0){
vis[nex] = 1;
pq.push(nex)
}
}
}
}
// 需要求出深度的
void bfs() {
int level = 0;
vis[] = 0; // or set
queue<int> pq(original_val);
while (!pq.empty()) {
int sz = pq.size();
while (sz--) {
int cur = pq.front(); pq.pop();
for (遍历cur所有的相邻节点nex) {
if (nex节点有效 && vis[nex] == 0) {
vis[nex] = 1;
pq.push(nex)
}
} // end for
} // end inner while
level++;
} // end outer while
}
代码仅供学习参考!大家还是要好好理解其中的原理,直到心里能熟练地过一遍逻辑并打出来才算掌握啦!一起加油!!!!