【问题描述】
已知一棵完全二叉树的总结点数为n,编程求它的叶子结点数n0。
【输入格式】
完全二叉树的总结点数n
【输出格式】
完全二叉树的总结点数n0
【输入样例】
1001
【输出样例】
501
【算法分析】
设完全二叉树的总结点数为n,叶子结点数为n0,单分支结点数为n1,双分支结点数为n2,则有:n=n0+n1+n2
又因为二叉树有性质:n0=n2+1
两式子联立得:n0=(n+1-n1)/2
由于完全二叉树的单分支结点数n1要么为0,要么为1。所以,当n为偶数时,n1必须为1,才能保证n0为整数。等价于当n为偶数时,n0=n/2;当n为奇数时,n1必须为0,才能保证n0为整数。等价于当n为奇数时,n0=(n+1)/2
【算法代码】
#include <bits/stdc++.h>
using namespace std;
int n;
int main() {
cin>>n;
if(n%2==0) cout<<n/2<<endl;
else cout<<(n+1)/2<<endl;
return 0;
}
/*
in:
1001
out:
501
*/