104.二叉树的最大深度
本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。
- 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
- 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数后者节点数(取决于高度从0开始还是从1开始)
通俗解释就是深度是从上往下数, 高度是从下往上数
而根节点的高度就是二叉树的最大深度,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度。
class Solution {
public:
int get_depth(TreeNode* root){
if(root == NULL) return 0; //这是叶子结点下一个点,所以高度为0,就返回0
int leftmax = get_depth(root->left); //左边的最大值
int rightmax = get_depth(root->right); //右边的最大值
int middlemax = max(leftmax, rightmax) +1; //中间的最大值
return middlemax;
}
int maxDepth(TreeNode* root) {
return get_depth(root);
//return get_depth(TreeNode*root); 一开始写成这个了编译出错,应该是定义函数和使用函数的传入值没搞清楚
}
};
111.二叉树的最小深度
要注意这个题与上一个题的区别,直接从上面那个题改行不通,理由如下:
如果一边没有孩子,那么没有左孩子的分支会算为最短深度。
所以,如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度。
反之,右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。 最后如果左右子树都不为空,返回左右子树深度最小值 + 1 。 求二叉树的最小深度和求二叉树的最大深度的差别主要在于处理左右孩子不为空的逻辑。
class Solution {
public:
int get_depth(TreeNode* root){
if(root == NULL) return 0; //这是叶子结点下一个点,所以高度为0,就返回0
int leftmin = get_depth(root->left); //左边的最大值
int rightmin = get_depth(root->right); //右边的最大值
if(root->left ==NULL &&root->right !=NULL) return 1+rightmin;
else if(root->right ==NULL &&root->left !=NULL) return 1+leftmin;
else
return 1+min(leftmin, rightmin);
}
int minDepth(TreeNode* root) {
return get_depth(root);
}
};
222.完全二叉树的节点个数
和上面的求深度的题差不多,把求深度的代码改成左右相加的代码就可以算出来,也是后序遍历,不过这是针对普通的二叉树的迭代法。还有针对完全二叉树的,二刷的时候再看吧;
class Solution {
public:
int get_depth(TreeNode* root){
if(root == NULL) return 0; //这是叶子结点下一个点,所以高度为0,就返回0
int leftmin = get_depth(root->left); //左边的最大值
int rightmin = get_depth(root->right); //右边的最大值
int sum = leftmin+ rightmin+1;
return sum;
}
int countNodes(TreeNode* root) {
return get_depth(root);
}
};