从键盘读入一串整数构造一棵二叉排序树,并对得到的二叉排序述进行中序遍历,得到有序序列。
#include
#include
typedef int TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
int InitBiTree(BiTree *T)
{
*T = NULL;
return 1;
}
int SearchBST(BiTree T,TElemType e,BiTree f,BiTree *p)
{
if(!T)
{
*p = f;
return 0;
}
else
{
if(e==T->data)
{
*p = T;
return 1;
}
else
if(edata)
return SearchBST(T->lchild,e,T,p);
else
return SearchBST(T->rchild,e,T,p);
}
}
int InsertBST(BiTree *T,TElemType e)
{
BiTree s,p;
if(!SearchBST(*T,e,NULL,&p))
{
s = (BiTree)malloc(sizeof(BiTNode));
s->data = e;
s->lchild = s->rchild = NULL;
if(!p)
*T = s;
else
{
if(edata)
p->lchild = s;
else
p->rchild = s;
}
return 1;
}
else
return 0;
}
int Visit(TElemType e)
{
printf("%d ",e);
return 1;
}
int InOrderTraverse(BiTree T,int (* Visit)(TElemType e))//递归中序遍历二叉树
{
if(T)
{
if(InOrderTraverse(T->lchild,Visit))
if(Visit(T->data))
if(InOrderTraverse(T->rchild,Visit))
return 1;
return 0;
}
else
return 1;
}
int CreateBST(BiTree *T)
{
TElemType e;
scanf("%d",&e);
while(e!=-1)
{
InsertBST(T,e);
scanf("%d",&e);
}
return 1;
}
void main()
{
BiTree T;
InitBiTree(&T);
CreateBST(&T);
InOrderTraverse(T,Visit);
}
此定义为递归式定义。
二叉排序树又称二叉查找树,它可以是一棵空树,若非空时具有下述性质:
1、若根结点的左子树非空,则左子树上所有结点的关键字值均小于等于根结点的关键字值。
2、若根结点的右子树非空,则右子树上所有结点的关键字值均大于等于根结点的关键字值。
3、根结点的左、右子树也分别为二叉排序树。
二叉排序树建立说明:
当需要插入一个节点到二叉排序树时,需要先找到它的父节点。
其实 它就是用插入的节点不断的和每一个节点比较(第一次当然是和根节点比较啦),如果小于等于则进入左边子树,再与左边子树的根节点比较,直到找到它要放的位置,否则进入右子树,进行上述操作。
下面是我写的程序,是控制台下的程序:
#include
#include
using namespace std;
typedef struct node
{
int element;
struct node* left;
struct node* right;
}Node,*NodePtr;
void insertNode(NodePtr *head,int data)//插入节点,注意这用了指向指针的指针,很有意思
{
if (*head==NULL)
{
*head=new Node;
(*head)->element=data;
(*head)->left=NULL;
(*head)->right=NULL;
}
else
{
if (dataelement)
{
insertNode(&((*head)->left),data);
}
else
{
insertNode(&((*head)->right),data);
}
}
}
NodePtr creatTree()//构造二叉排序树,控制台下输入整数,0表示结束输入
{
NodePtr head=NULL;
int data;
scanf("%d",&data);
while(data!=0)
{
insertNode(&head,data);
scanf("%d",&data);
}
return head;
}
void printTree(NodePtr head)//中序遍历二叉排序树,得到有序序列
{
if(head!=NULL)
{
printTree(head->left);
printf("%d ",head->element);
printTree(head->right);
}
}
int main()
{
NodePtr head;
printf("请输入一串整数,空格隔开,0表示输入结束
");
head=creatTree();
printf("中序遍历二叉排序树
");
printTree(head);
printf("
");
return 0;
}
运行结果:
不知道符合你要求没,有问题可以hi我。
说明:为了保证输入的数据按要求构造出想要的、唯一确定的二叉树的形状,这里输入要求利用广义表的形式,虽然会显得繁琐一点,但足以保证严谨性。否则只是单纯一串数字,树形就能千变万化,不一定的。
#include <stdio.h>
#include <malloc.h>
#define MaxSize 10
#define Number 30
struct BiTNode{//定义数据结构
char data;
BiTNode *lchild,*rchild;
};
void InitBtree(BiTNode * &BT){//初始化二叉树
BT=NULL;
}
void CreateBiTree(BiTNode *&BT,char *str){//建立二叉树
BiTNode *s[MaxSize];
int top=-1;
BT=NULL;
BiTNode *p=NULL;
int k, j=0;
char ch;
ch=str[j];
while(ch!='\0'){
switch(ch){
case '(':
top++;
s[top]=p;
k=1;
break;
case ')':
top--;
break;
case ',':
k=2;
break;
default:
p=(struct BiTNode *) malloc(sizeof(struct BiTNode));
p->data=ch;
p->lchild=p->rchild=NULL;
if(BT==NULL)
BT=p;
else{
if(k==1)
s[top]->lchild=p;
else
s[top]->rchild=p;
}
}
j++;
ch=str[j];
}
}
void PrintBtree(BiTNode *BT){//输出二叉树
if(BT!=NULL){
putchar(BT->data);
if(BT->lchild!=NULL||BT->rchild!=NULL){
putchar('(');
PrintBtree(BT->lchild);
if(BT->rchild!=NULL)
putchar(',');
PrintBtree(BT->rchild);
putchar(')');
}
}
}
void inorder(BiTNode *BT){//中序遍历二叉树
if(BT!=NULL){
inorder(BT->lchild );
printf("%c ",BT->data);
inorder(BT->rchild );
}
}
void DeleteBtree(BiTNode *BT){//删除二叉树的所有的节点
if(BT!=NULL){
DeleteBtree(BT->lchild );
DeleteBtree(BT->rchild );
free(BT);
}
}
void ClearBtree(BiTNode *&BT){//清除二叉树
DeleteBtree(BT);
BT=NULL;
}
void main(){
BiTNode *BT,*BT1;
char c;
printf("请以广义表形式输入一个二叉数 (如A(B(C,D),E(,F))的形式)\n\n");
char string[Number]="A(B(,C),D(E(F),G(,H)))";
/*char string[Number],ch;
int i=0;
ch=getchar();
while(ch!='\n' && i<Number){
string[i]=ch;
i++;
ch=getchar();
}
string[i]='\0';
*///想要按要求自己输入只需去掉此部分的注释即可
printf("这里为了减少重复输入,测试采用默认的输入:\n");
InitBtree(BT);
CreateBiTree(BT,string);
PrintBtree(BT);
printf("\n\n\n中序遍历二叉树顺序为: ");
inorder(BT);
printf("\n\n");
ClearBtree(BT);
scanf("%c",&c );
}
用scanf函数时是不是回车是结束输入,空格当做ASCII接收?那什么情况下...
解决方法:scanf()函数执行成功时的返回值是成功读取的变量数,也就是说,你这个scanf()函数有几个变量,如果scanf()函数全部正常读取,它就返回几。但这里还要注意另一个问题,如果输入了非法数据,键盘缓冲区就可能还个有残余信息问题。 正确的例程: #include <stdio.h> int main() { int a,b,c; \/*计算a+b...
【高分】帮忙用汇编语言做一个程序:学生成绩统计
; 功能:键盘输入一个指定位数的十进制数字,将其转换成二进制数并保存在指定的内存单元。; 由于限定...dec cx ;实际输入的数字位数减1,准备把输入的这一串数字转换成二进制数 jcxz @@One_Digit ;若输入...lodsb ;读入实际输入的字符个数 test al,al jz @@L1 ;若输入学生姓名时,直接回车,认为学生姓名、...
求sprintf函数的详解,要附带例子,粘贴复制来的也可以,只要清晰内容好就...
%x,%X 读入十六进制整数 %s 读入一个字符串,遇空格、制表符或换行符结束。 %f,%F,%e,%E,%g,%G 用来输入实数,可以用小数形式或指数形式输入。 %p 读入...但这里还要注意另一个问题,如果输入了非法数据,键盘缓冲区就可能还个有残余信息问题。正确的例程: #include <stdio.h> int main() { int a,b,c; \/...
pc1500a与BASIC语言
INT() 返回不大于给定数的最大整数 相同 LOG() 返回一个数值的自然对数 相同 RND() 产生0-1之间...INKEY$ 从键盘读入一个字符 相同 INPUT 从键盘读取输入 相同 LOCATE 把文件光标定位到指定的行,列 ...输入一串字符,将它的内容按下列的密码规则转换为明码输出 密码: A B C D E F G H I J K L...
信用卡59舞弊嫌疑什么意思
2、不要刷上万的整数交易,例如刷1万元的话,可以刷成9950或10185。 3、不要刷有角分的交易,例如刷...一,经常使用POS机刷卡的小伙伴可能知道,刷卡不成功的时候机器上会显示一串数字提示,不同的失败原因对应...商品上之条码能透过收银设备上光学读取设备直接读入后(或由键盘直接输入代号)马上可以显示商品信息(单价...
计算机硬件设备有那些
12、键盘 英文名为“Keyboard”,分为有线和无线,键盘是主要的人工学输入设备,通常为104或105键,用于把文字、数字等输到电脑上,以及电脑操控。13、鼠标 英文名为“Mouse”,当人们移动鼠标时,电脑屏幕上就会有一个箭头指针跟着移动,并可以很准确指到想指的位置,快速地在屏幕上定位,它是人们使用...
计算机硬件包括哪些
键盘是电脑中不可缺少的输入设备,用户可以通过键盘输入命令和数据,并可通过它控制电脑的运行。常见的...内存可以分为随机访问存储器和只读存储器,前者允许数据的读取与写入,磁盘中的程序必须被调入内存后才能...在存储器中含有大量的基本单元,每个存储单元可以存放八个二进制位,即一个零到二百五十五之间的整数、...
虞荣维平: 利用c语言,代码如下仅供参考: 说明:为了保证输入的数据按要求构造出想要的、唯一确定的二叉树的形状,这里输入要求利用广义表的形式,虽然会显得繁琐一点,但足以保证严谨性.否则只是单纯一串数字,树形就能千变万化,不一定的...
同心县19380613970: 设计一个读入一串整数构成一棵二叉排序树的程序 - ?
虞荣维平: 此定义为递归式定义. 二叉排序树又称二叉查找树,它可以是一棵空树,若非空时具有下述性质:1、若根结点的左子树非空,则左子树上所有结点的关键字值均小于等于根结点的关键字值.2、若根结点的右子树非空,则右子树上所有结点...
同心县19380613970: 从键盘读入一组整数,并利用二叉树排序方法将排好的整数输出.?
虞荣维平: #include "stdio.h" void Print( int array[],int length) { int i; for(i=0;i<length;i++) printf("%d\t",array[i]); printf("\n"); } double Average( int array[],int length) { double avg,sum=0; int i; for(i=0;i<length;i++) sum=sum+array[i]; avg=sum/length; return ...
同心县19380613970: 将一组读入的整数构成一棵二叉排序树,并对任一整数进行查找 - ?
虞荣维平: #include <stdio.h> #include <stdlib.h> #define STACK_MAX_SIZE 30 #define QUEUE_MAX_SIZE 30#ifndef elemType typedef int elemType; #endif struct BTreeNode{ elemType data; struct BTreeNode *left; struct BTreeNode *right; }; /*1.查找*/ /*递...
同心县19380613970: 设计一个读入一串整数构成一棵二叉检索树的算法 - ?
虞荣维平: 二叉排序树建立说明: 当需要插入一个节点到二叉排序树时,需要先找到它的父{ NodePtr head; printf(
同心县19380613970: 设计一个读入一串整数构成一颗二叉检索树的算法 - ?
虞荣维平: #include#include using namespace std; typedef struct node { int element; struct node* left; struct node* right; }Node,*NodePtr; void insertNode(NodePtr *head,int data)//插入节点,注意这用了指向指针的指针,很有意思 { if (*head==NULL) { *head=...
同心县19380613970: 建立一棵二叉树,数据以字符串形式从键盘输入. - ?
虞荣维平: 代码如下: char a[105]; int len,i;//i逐渐增加 void build(int s){ if(i==len) return;//已经建完树了 char c=a[i];//当前的字符 i++; if(!tree[s].l) tree[s].l=c;//如果树的左边是空的,就给左边赋值 else tree[s].r=c;//反之 if(c!=' ') build(c); if(c!=' ') build(c);//再...
同心县19380613970: 从键盘依次输入23、56、20、45、34、77、43、100、60,建立二叉排序树,先序遍历序列为() - ?
虞荣维平: 序遍历序列为(23、100、20) 中序遍历序列为(100、77、60、45、43、34、60、56、43、45、34、23、56、77
同心县19380613970: 依次插入关键字37,50,42,18,48,12,56,30,23,构造一棵二叉排序树,并计算平均查找长度 - ?
虞荣维平:[答案] 37是根 18是37的左孩子 50是37的右孩子 12是18的左孩子 30是18的右孩子 23是30的左孩子 42是50的左孩子 56是50的右孩子 48是42的右孩子 平均查找长度是 1+2+2+3+3+3+3+4+4/9=
同心县19380613970: 实现二叉排序树的生成,完成二叉排序树的遍历、查找. - ?
虞荣维平: /*设计一个读入一串整数构e69da5e887aae799bee5baa631333361303634成一棵二叉排序树的程序,并对其中序遍历*/#include "stdafx.h"#include "stdio.h"#include "malloc.h" typedef struct node { struct node* lchild,* rchild; int data; }...