顺序二叉树在课本上可考研中出现的频率都很少,也不像二叉链表那样具有丰富的可操作性,故本文只写顺序二叉树的建立和学习过程中遇到问题——fflush(stdin)(清除输入缓存)。
1.顺序二叉树
过程不繁琐,直接上代码
#include<stdio.h> //递归建立顺序二叉树,数组第一位存放结点个数
#include<string.h>
#include<stdlib.h>
#define maxsize 51 //第一位存放二叉树结点个数,从而根结点序号为1,所有节点序号皆满足二叉树性质
#define elemtype char
typedef char SqBiTree[maxsize];
void InitTree(SqBiTree T)
{
char j;
int i;
printf("请输入二叉树结点个数:");
scanf("%c",&j);
T[0]=j;
printf("结点个数为%c\n",j);
for(i=1;i<maxsize;i++)
{
T[i]='\0';
}
}
void CreateTree(SqBiTree T,int i) //递归建立顺序二叉树
{
fflush(stdin);
elemtype x;
scanf("%c",&x);
if(x=='#')
{
T[i]='\0';
return;
}
T[i]=x;
printf("请输入其左子结点数据:");
CreateTree(T,2*i);
printf("请输入其右子结点数据:");
CreateTree(T,2*i+1);
}
void PrintTree(SqBiTree T)
{
for(int i=0;i<maxsize;i++)
{
printf("%c",T[i]);
}
}
void main()
{
SqBiTree t;
InitTree(t);
printf("请输入根节点数据:");
CreateTree(t,1);
PrintTree(t);
}
建立如图所示二叉树(随便画的图,将就下哈)
结果如下(补足的位置由字符型空格’\0’填充)
总结二叉树建立大都用递归或栈的思想(递归代码量少,所以我选用前者),因为每个结点都要存储数据且不需要进行运算,所以数据类型选char型,于是出现了以下问题。
2.fflush(stdin);
fflush(stdin)的作用是清除输入缓存,把输入缓存中多余的未被保存的内容清除,以便下次读取。而在我们日常的学习中,多数以int型进行数据运算和存储,所以基本用不到fflush。
例如下程序:
#include<stdio.h>
void main()
{
int a,b;
scanf("%d",&a);
printf("%d",a);
scanf("%d",&b);
printf("%d",b);
}
结果正常,也很容易预料,但如果把int型改为字符型char
#include<stdio.h>
void main()
{
char a,b;
scanf("%c",&a);
printf("%c",a);
scanf("%c",&b);
printf("%c",b);
}
则输入的字符和回车符一并被存入输入缓冲区,而第二次输入则被无视,编译器直接读取了回车符,也许如上并不直观,可以换做如下输入
可以看到,abc都被存到了输入缓冲区,而两次输出分别将a,b输出,与我们希望的两次输入再分别输出不同,此时只要在第二次输入前加上flush(stdin);即可将之前的缓存内容清除,便可得到我们希望的结果。
char a,b;
scanf("%c",&a);
printf("%c",a);
fflush(stdin);
scanf("%c",&b);
printf("%c",b);
特别是在处理字符型结构变量的时候,要格外注意这一点。