利用二叉排序树,统计随机从键盘上输入的字符个数,然后输出字符和对应的个数

 我来答
匿名用户
2017-04-24
展开全部
1、统计字符串中字符出现的次数
编写一个程序,由键盘输入一个字符串,统计该字符串中出现的字符及其次数。然后输出结果。要求用一个二叉树来保存处理结果,字符串中每个不同的字符用树的结点表示,结点应该包含四个域:该字符、该字符出现的次数、左子树指针、右子树指针;其中左子树的字符的ASCII码均小于该字符,右子树的字符的ASCII码均大于该字符。

提示:
ü 从字符串中依次读取字符,在二叉树中查找该字符是否存在。
ü 如果存在,则该字符的出现次数加1;如果不存在,则按照二叉排序树的要求插入该字符结点,同时设置出现次数为1。
ü 全部字符读完以后,调用二叉树的中序遍历,有序的输出每个字符及其出现的次数。

Code:
/**
* Author: XadillaX
* Data: 2010-12-27
*/
#include <iostream>
using namespace std;

struct BSTreeCH {
char ch;
int time;
BSTreeCH *lc, *rc;

/** 构造函数 */
BSTreeCH(char _ch)
{
lc = rc = NULL;
ch = _ch;
time = 1;
}
};

/**
* @brief 对字符统计二叉树插入节点
*/
void InsertBST_CH(BSTreeCH *t, char ch)
{
/** 若已存在 */
if(ch == t->ch)
{
t->time++;
return;
}

/** 直接插入或者递归插入 */
if(ch < t->ch && NULL == t->lc) t->lc = new BSTreeCH(ch);
else
if(ch > t->ch && NULL == t->rc) t->rc = new BSTreeCH(ch);
else
if(ch < t->ch) InsertBST_CH(t->lc, ch);
else
if(ch > t->ch) InsertBST_CH(t->rc, ch);
}

/**
* @brief 删除字符统计二叉树
*/
void DelBST_CH(BSTreeCH *t)
{
if(NULL != t->lc) DelBST_CH(t->lc);
if(NULL != t->rc) DelBST_CH(t->rc);

delete t;
}

/**
* @brief 中序遍历字符统计二叉树
*/
void TraBST_CH(BSTreeCH *t)
{
if(NULL != t->lc) TraBST_CH(t->lc);
printf("'%c'(%4d): %4d/n", t->ch, t->ch, t->time);
if(NULL != t->rc) TraBST_CH(t->rc);
}

/**
* @brief 统计字符
*/
void BST_CH()
{
FILE *fp;
BSTreeCH *root = NULL;

if(NULL == (fp = fopen("a.txt", "r")))
{
printf("Error on opening file./n");
return;
}

/** 读文件 */
while(!feof(fp))
{
char ch;
ch = fgetc(fp);
if(-1 == ch) break;

/** 建根 */
if(NULL == root)
{
root = new BSTreeCH(ch);
continue;
}

/** 插入 */
InsertBST_CH(root, ch);
}

fclose(fp); ///< 关闭文件

TraBST_CH(root); ///< 遍历树
DelBST_CH(root); ///< 删除树
root = NULL;
}

int main()
{
BST_CH();

return 0;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式