104.二叉树的最大深度
//利用求根节点最大高度确定二叉树的最大深度
//根节点最大高度=二叉树的最大深度
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int get_height(struct TreeNode* root){
if(!root) return 0;
int left_height=get_height(root->left);
int right_height=get_height(root->right);
if(left_height>=right_height) return left_height+1;
return right_height+1;
}
int maxDepth(struct TreeNode* root) {
return get_height(root);
}
111.二叉树的最小深度
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
//根节点最小高度=二叉树的最小深度
//最小深度是从根节点到最近叶子节点的最短路径上的节点数量
int get_height(struct TreeNode* root){
if(!root) return 0;
if(!root->left&&!root->right) return 1;
int left_height=get_height(root->left);
int right_height=get_height(root->right);
//printf("left_height=%d,get_height(root->left)=%d\n",left_height,get_height(root->left));
//这样会再重复调用一次get_height(root->left)
//区别求最大深度:当一个孩子结点为空,则应使用另一个孩子的高度
if(root->left&&!root->right) return 1+left_height;
//错解:return 1+get_height(root->left);
//这样会再重复调用一次get_height(root->left)
else if(!root->left&&root->right) return 1+right_height;
if(left_height<=right_height) return left_height+1;
return right_height+1;
}
int minDepth(struct TreeNode* root) {
return get_height(root);
}
222.完全二叉树节点的数量
//完全二叉树解法
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int countNodes(struct TreeNode* root) {
if (!root)
return 0;
//完全二叉树独有优化
struct TreeNode* cur_left = root->left;
struct TreeNode* cur_right = root->right;
int left_depth = 0, right_depth = 0;
while (cur_left) {
left_depth++;
cur_left = cur_left->left;
}
while (cur_right) {
right_depth++;
cur_right = cur_right->right;
}
if (left_depth == right_depth)
//只用计算左右子树最外侧深度是否相同即可判断该子树是否为满二叉树(完全二叉树的特性)
return (2 << left_depth) - 1;
// left_depth=h-1;2<<left_depth-1=2^h-1
// 2<<0 左移0位 = 2^1
//2<<1 左移1位 =2^2
//满二叉树结点数量直接用公式求:2^h -1
int left_num = countNodes(root->left);
int right_num = countNodes(root->right);
return left_num + right_num + 1;
}