编程求完全二叉树的叶子结点数

【问题描述】
已知一棵完全二叉树的总结点数为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
*/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你的问题。这是一个关于二叉树的问题,需要根据先序扩展序列构建二叉树,并出二叉树的结点数叶子结点数和高度。下面是 C 语言的代码实现,供你参考: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树结构体 typedef struct TreeNode { char val; // 结点值 struct TreeNode* left; // 左子结点 struct TreeNode* right; // 右子结点 } TreeNode; // 根据先序扩展序列构建二叉树的函数 TreeNode* buildTree(char* s, int* i) { if (s[*i] == '#' || s[*i] == '\0') { // 空结点返回 NULL (*i)++; return NULL; } TreeNode* node = (TreeNode*) malloc(sizeof(TreeNode)); // 创建结点 node->val = s[(*i)++]; node->left = buildTree(s, i); // 递归构建左子树 node->right = buildTree(s, i); // 递归构建右子树 return node; } // 叉树点数的函数 int countNodes(TreeNode* root) { if (root == NULL) { return 0; } return 1 + countNodes(root->left) + countNodes(root->right); } // 叉树叶子结点数的函数 int countLeaves(TreeNode* root) { if (root == NULL) { return 0; } if (root->left == NULL && root->right == NULL) { // 判断是否为叶子结点 return 1; } return countLeaves(root->left) + countLeaves(root->right); } // 叉树高度的函数 int getHeight(TreeNode* root) { if (root == NULL) { return 0; } int leftHeight = getHeight(root->left); // 左子树高度 int rightHeight = getHeight(root->right); // 右子树高度 return 1 + (leftHeight > rightHeight ? leftHeight : rightHeight); } // 主函数 int main() { char s[100]; printf("请输入先序扩展序列:\n"); scanf("%s", s); int i = 0; TreeNode* root = buildTree(s, &i); // 构建二叉树 int nodes = countNodes(root); // 点数 int leaves = countLeaves(root); // 叶子结点数 int height = getHeight(root); // 叉树高度 printf("结点数:%d\n", nodes); printf("叶子结点数:%d\n", leaves); printf("二叉树高度:%d\n", height); return 0; } ``` 输入先序扩展序列后,程序会自动构建二叉树,并输出二叉树的结点数叶子结点数和高度。注意,输入的字符串长度不能超过 100。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值