104.二叉树的最大深度
题目
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例: 给定二叉树 [3,9,20,null,null,15,7],返回它的最大深度 3
思考
这题就一句话:用层序遍历把遍历了多少层求出来即可,有多少层深度就是多少,在此重点强调一下,深度和高度的区别:
- 二叉树节点的深度:指从该节点到根结点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
- 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始。
代码
// 层序遍历,把一共有多少层求出即可
class Solution {
public:
int maxDepth(TreeNode* root) {
queue<TreeNode*> que;
if(root == nullptr) return 0;
que.push(root);
int res = 0;
while(!que.empty()) {
int size = que.size();
while(size--) {
TreeNode* node = que.front();
que.pop();
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
res++;
}
return res;
}
};
559.n叉树的最大深度
题目
给定一个 n 叉树,找到其最大深度。
最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。
例如,给定一个 3叉树 :我们应返回其最大深度 3。
思考
和上题一样,有多少层深度就是多少,注意这里用for循环把n叉树所有结点都遍历到
N叉树的定义:
class Node {
public:
int val;
vector<Node*> children;
Node() {}
Node(int _val) {
val = _val;
}
Node(int _val, vector<Node*> _children) {
val = _val;
children = _children;
}
};
代码
class Solution {
public:
int maxDepth(Node* root) {
queue<Node*> que;
if(root == NULL) return 0;
que.push(root);
int res = 0;
while(!que.empty()) {
int size = que.size();
while(size--) {
Node* node = que.front();
que.pop();
if((node->children).size() > 0) {
for (auto n : node->children) que.push(n);//遍历children结点
}
}
res++;
}
return res;
}
};
111.二叉树的最小深度
题目
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
思考
本题思想依旧是层序遍历,只是这里并不是要遍历所有层(只有当是满二叉树时才需要),顺着这个思路想,如果有一个结点它的左右孩子都为空时,那么证明这个结点已经到底了,最小深度就是这个结点的深度,不管它是不是所处在最后一层
代码
// 层序遍历
class Solution {
public:
int minDepth(TreeNode* root) {
queue<TreeNode*> que;
if(root == nullptr) return 0;
que.push(root);
int res = 0;
while(!que.empty()) {
int size = que.size();
res++;
while(size--) {
TreeNode* node = que.front();
que.pop();
if(!node->left && !node->right) return res;//只要有一个结点的左右子结点都为空,证明到在它那个位置到底了
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return res;
}
};
222.完全二叉树的节点个数
题目
给出一个完全二叉树,求出该树的节点个数,注意res的初始值为零而不是一
思考
不用思考,直接遍历++就行
代码
// 层序遍历
class Solution {
public:
int countNodes(TreeNode* root) {
queue<TreeNode*> que;
if(root ==nullptr) return 0;
que.push(root);
int res = 0;
while(!que.empty()) {
int size = que.size();
while(size--) {
TreeNode* node = que.front();
que.pop();
res++;
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return res;
}
};