一、110 平衡二叉树
int gethight(struct TreeNode* root){
if(root==NULL)
return 0;
//后序遍历
int leftdepth = gethight(root->left);//左
int rightdepth = gethight(root->right);//右
return leftdepth>=rightdepth?leftdepth+1:rightdepth+1;//中
}
bool isBalanced(struct TreeNode* root) {
if(root==NULL)
return true;
int leftdepth = gethight(root->left);
int rightdepth = gethight(root->right);
if(rightdepth-leftdepth>1||leftdepth-rightdepth>1)
return false;
return (isBalanced(root->left)&&isBalanced(root->right));
}
二、 404 左叶子之和
int sumOfLeftLeaves(struct TreeNode* root) {
if(root==NULL)
return 0;
if(root->left==NULL&&root->right==NULL)
return 0;
int leftnum = sumOfLeftLeaves(root->left);//收集左子树中符合条件的左叶子值的和
if(root->left!=NULL&&root->left->left==NULL&&root->left->right==NULL){//根据父节点判断子节点是否是需要处理的值
leftnum = root->left->val;
}
int rightnum = sumOfLeftLeaves(root->right);//收集右子树中符合条件的左叶子值的和
int sum = leftnum+rightnum;
return sum;
}
三、222 完全二叉树的节点个数
//使用完全二叉树的特性:叶子节点一定是连续的,这样一直递归遍历,一定会找到满二叉树,就可以使用公式计算节点个数
int countNodes(struct TreeNode* root) {
if(root==NULL)
return 0;
struct TreeNode* left = root->left;//指针指向左子树
struct TreeNode* right = root->right;//指针指向右子树
int leftdepth = 0;//记录左子树的深度
int rightdepth = 0;//记录右子树的深度
while(left!=NULL){//一直遍历左子树的外侧
left = left->left;
leftdepth++;//保存左子树的深度
}
while(right!=NULL){
right = right ->right;//一直遍历右子树的外侧
rightdepth++;//保存右子树的深度
}
if(leftdepth==rightdepth)//如果为满二叉树
return (2<<leftdepth)-1;//使用公式计算结点总数,2<<leftdepth是位运算
//后序遍历
int leftnum = countNodes(root->left);//左
int rightnum = countNodes(root->right);//右
int result = leftnum+rightnum+1;//中
return result;
}
//使用计算普通二叉树节点的方式采用后序遍历进行计算
int countNodes(struct TreeNode* root){
if(root==NULL)
return 0;
int leftnum = countNodes(root->left);//左
int rightnum = countNodes(root->right);//右
int result = leftnum+rightnum+1;//中
return result;
}