题解 | #二叉树#

二叉树

https://www.nowcoder.com/practice/f74c7506538b44399f2849eba2f050b5

#include <iostream>
using namespace std;

/**
    node:当前结点
    totalNode:总结点数
    return:编号为node的结点有多少个孩子结点(包括node)
*/
int sum(int node, int totalNode){
    if(totalNode / 2 == node){ //当前结点的下一层就是叶结点了
        if(totalNode % 2 == 0){ //只有左孩子
            return 1 + 1;
        }else{ //左右孩子都有
            return 2 + 1;
        }
    }else if(totalNode / 2 < node){ //倒数第二层,靠右边的叶结点
        return 1;
    }else{ //totalNode / 2 > node 比较上层的结点
        return sum(node * 2, totalNode) + sum(node * 2 + 1, totalNode) + 1;
    }
}

int main() {
    int m,n; //m当前结点, n总结点
    while (scanf("%d %d", &m, &n) != EOF) { // 注意 while 处理多个 case
        if(0 == m && 0 == n){
            break;
        }
        printf("%d\n", sum(m, n));
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

点赞 评论 收藏
分享
认真搞学习:28小登的建议,投算法岗不要写什么物理竞赛,互联网+,多写点项目,用什么算法做了什么。还有本科算法是不可能的开发你这个也没有项目啊
点赞 评论 收藏
分享
06-08 22:25
门头沟学院 Java
从零开始的转码生活:这hr不会打开手机不分青红皂白给所有人群发这句话,过一会再给所有人再发一遍,这肯定会有重复的,不管,再过一会再发一遍
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务