二叉树的节点的深度:从根节点 到该节点的最长简单路径边的条数或者节点数 【取决于深度从0开始还是从1开始】
二叉树节点的高度:该节点到 叶子节点的最长简单路径边的条数或者节点数 【取决于深度从0开始还是从1开始】
前序遍历【中左右】 就是求 叶子节点的深度
后序遍历【左右中】 就是求根节点的高度
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回它的最大深度 3 。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PeLaNzEv-1668335854886)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20221113162639744.png)]
//递归法
/**
* 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) {}
* };
*/
class Solution {
public:
//求高度,根节点的高度就是二叉树的最大深度
//用 后序遍历来求根节点高度
int getHight(TreeNode* node){
//递归终止条件
if(node == nullptr) return 0; //到达叶子节点的左右空孩子,高度为0;
//单层递归逻辑
int leftHight = getHight(node ->left); //求左孩子的高度
int rightHight = getHight(node -> right); //求右孩子的高度
int result = 1 + max(leftHight,rightHight); //处理中节点
return result;
}
int maxDepth(TreeNode* root) {
if(root == nullptr) return 0;
return getHight(root); //求根节点的高度
}
};
//迭代法:利用层序遍历来求深度
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:2
示例 2:
输入:root = [2,null,3,null,4,null,5,null,6]
输出:5
/**
* 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) {}
* };
*/
class Solution {
public:
int getHight(TreeNode* node){
if(node == nullptr) return 0;
int leftHight = getHight(node ->left);
int rightHight = getHight(node -> right);
//int result = 1 + min(leftHight,rightHight) 答案是错的,因为当根节点的左子树为空时,最小深度会返回0,不符合 最小深度是从根节点到最近叶子节点的最短路径上的节点数量 这个定义
//有 三种情况
//左子树为空,右子树不为空时
if(node ->left == nullptr && node -> right != nullptr){
return 1 + rightHight;
}
//右子树为空,左子树不为空时,返回左子树高度
if(node ->left != nullptr && node -> right == nullptr){
return 1 + leftHight;
}
//左右子树都不为空时,返回min()
int result = 1 + min(leftHight,rightHight);
return result;
}
int minDepth(TreeNode* root) {
//依旧采取后序遍历,结果取高度的最小值
return getHight(root);
}
};
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
示例 1:
输入:root = [1,2,3,4,5,6]
输出:6
示例 2:
//递归法,递归遍历每个节点
/**
* 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) {}
* };
*/
class Solution {
public:
//递归法,利用后序遍历 遍历二叉树的所有节点,并计数
//返回值是 节点个数
int traversal(TreeNode* node){
if(node == nullptr) return 0;
int leftSum = traversal(node->left);
int rightSum = traversal(node-> right);
int result = 1 + leftSum + rightSum;
return result;
}
int countNodes(TreeNode* root) {
return traversal(root);
}
};
//迭代法,利用层序遍历
/**
* 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) {}
* };
*/
class Solution {
public:
int countNodes(TreeNode* root) {
//层序遍历每个节点,并计数
queue que;
if(root != nullptr) que.push(root); //必须要对root是否为空进行判断
int result = 0;
while(!que.empty()){
int size = que.size();
for(int i = 0;i < size;i++){
TreeNode* cur = que.front();
que.pop();
result++;
if(cur->left) que.push(cur->left);
if(cur->right) que.push(cur->right);
}
}
return result;
}
};