代码随想录算法训练营第十五天|110 平衡二叉树、404 左叶子之和、222 完全二叉树的节点个数

一、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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值