从键盘读入一串整数构造一棵二叉排序树,并对得到的二叉排序述进行中序遍历,得到有序序列。

作者&投稿:错咏 (若有异议请与网页底部的电邮联系)
编写一个读入一串整数构成一棵二叉排序树并进行中序遍历和查找的算法。 谢谢~

#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我。

利用c语言,代码如下仅供参考:

说明:为了保证输入的数据按要求构造出想要的、唯一确定的二叉树的形状,这里输入要求利用广义表的形式,虽然会显得繁琐一点,但足以保证严谨性。否则只是单纯一串数字,树形就能千变万化,不一定的。

#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”,当人们移动鼠标时,电脑屏幕上就会有一个箭头指针跟着移动,并可以很准确指到想指的位置,快速地在屏幕上定位,它是人们使用...

计算机硬件包括哪些
键盘是电脑中不可缺少的输入设备,用户可以通过键盘输入命令和数据,并可通过它控制电脑的运行。常见的...内存可以分为随机访问存储器和只读存储器,前者允许数据的读取与写入,磁盘中的程序必须被调入内存后才能...在存储器中含有大量的基本单元,每个存储单元可以存放八个二进制位,即一个零到二百五十五之间的整数、...

同心县19380613970: 从键盘读入一串整数构造一棵二叉排序树,并对得到的二叉排序述进行中序遍历,得到有序序列.
虞荣维平: 利用c语言,代码如下仅供参考: 说明:为了保证输入的数据按要求构造出想要的、唯一确定的二叉树的形状,这里输入要求利用广义表的形式,虽然会显得繁琐一点,但足以保证严谨性.否则只是单纯一串数字,树形就能千变万化,不一定的...

同心县19380613970: 设计一个读入一串整数构成一棵二叉排序树的程序 -
虞荣维平: 此定义为递归式定义. 二叉排序树又称二叉查找树,它可以是一棵空树,若非空时具有下述性质:1、若根结点的左子树非空,则左子树上所有结点的关键字值均小于等于根结点的关键字值.2、若根结点的右子树非空,则右子树上所有结点...

同心县19380613970: 从键盘读入一组整数,并利用二叉树排序方法将排好的整数输出.
虞荣维平: #include "stdio.h" void Print( int array[],int length) { int i; for(i=0;i&lt;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&lt;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; }...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网