#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(BSNode)
typedef struct node
{ int datax
struct node *lcd,*rcd
}BSNode
typedef BSNode *BSLink
int total=1
int last=0
void event1(BSNode *p,int x)/*建立二叉排序数*/
{BSNode *q
if(p->datax<x)
if(p->lcd==NULL)
{
q=(BSNode *)malloc(LEN)
q->datax=xq->lcd=NULLq->rcd=NULL
p->lcd=qtotal++
}else event1(p->lcd,x)
else
if(p->rcd==NULL)
{
q=(BSNode *)malloc(LEN)
q->datax=xq->rcd=NULLq->lcd=NULL
p->rcd=qtotal++
}else event1(p->rcd,x)
}
void event2(BSLink tpr,int x)/*遍历相加 */
{
if(tpr!=NULL)
{
tpr->datax=tpr->datax+x
event2(tpr->lcd,x)
event2(tpr->rcd,x)
}
}
void event3(BSLink *tpr,int x)/*传进来根指针tpr本身的地址,二级指针*/
{
BSNode *p
p=*tpr
if(*tpr==NULL)return
if((*tpr)->datax<=x)
{*tpr=(*tpr)->lcdfree(p)event3(tpr,x)}
else if((*tpr)->rcd)
{if((*tpr)->rcd->datax<=x)
{p=(*tpr)->rcd
(*tpr)->rcd=(*tpr)->rcd->lcd
free(p)
event3(tpr,x)}
else (*tpr)->rcd=NULL
}
}
void event4(BSLink tpr,int x,int *a)
{
if(tpr!=NULL)
{
event4(tpr->lcd,x,a)
{(*a)++
if((*a)==x)printf("%d\n",tpr->datax)}
event4(tpr->rcd,x,a)
}
}
void count(BSLink tpr)
{
if(tpr!=NULL)
{ count(tpr->lcd)
last++
count(tpr->rcd)
}
}
int main()
{
int en,t,x
int iint a=0
BSLink tpr=NULL
BSNode *p
scanf("%d",&en)
p=(BSNode *)malloc(LEN)
p->datax=0p->lcd=NULLp->rcd=NULL
tpr=p
for(i=0i<eni++)
{
scanf("%d %d",&t,&x)
switch(t)
{
case 1 :event1(p,x)break
case 2 :event2(tpr,x)break
case 3 :
event3(&tpr,x)
count(tpr)
printf("%d\n",total-last)
break
case 4 :a=0event4(tpr,x,&a)if(x>a)printf("-1")break
default:printf("ERROE INPUT!")
}
}
system("pause")
return 0
}
刚刚回答了一个类似的问题,以下代码供参考:#include "stdio.h"
#include "stdlib.h"
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char TElemType
typedef int Status
typedef struct BiTNode { // 结点结构
TElemType data
struct BiTNode *lchild, *rchild
// 左右孩子指针
} BiTNode, *BiTree
//以下是建立二叉树存储结构,空节点输入作为#结束标识
Status CreateBiTree(BiTree &T) {
char ch
scanf("%c",&ch)
if(ch=='#') T=NULL
else{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
exit(OVERFLOW)
T->data=ch
CreateBiTree(T->lchild)
CreateBiTree(T->rchild)
}
return OK
} // CreateBiTree
void Preorder(BiTree T)
{
if(T)
{
printf("%c",T->data)
Preorder(T->lchild)
Preorder(T->rchild)
}
}
void Inorder(BiTree T)
{ // 中序遍历二叉树
//请将该算法补充完整,参见第6章课件算法
if(T)
{
Inorder(T->lchild)
printf("%c",T->data)
Inorder(T->rchild)
}
}
void Postorder(BiTree T)
{ // 后序遍历二叉树
//请将该算法补充完整,参见第6章课件算法
if(T)
{
Postorder(T->lchild)
Postorder(T->rchild)
printf("%c",T->data)
}
}
//以下是求叶子结点数
void CountLeaf(BiTree T,int&count){
//请将该算法补充完整,参见第6章课件算法
if(T){
if((!T->lchild)&&(!T->rchild))
count++
CountLeaf(T->lchild,count)
CountLeaf(T->rchild,count)
}
}
//以下是求二叉树的深度
int Depth(BiTree T ){
//请将该算法补充完整,参见第6章课件算法
int depthval,depthLeft,depthRight
if(!T) depthval=0
else{
depthLeft = Depth(T->lchild)
depthRight = Depth(T->rchild)
if(depthLeft>depthRight)depthval = 1+depthLeft
else depthval = 1+depthRight
}
return depthval
}
void main(){
BiTree T
int s=0,d
printf("\n creat of the bitree:\n")
CreateBiTree(T)
printf("\n output result of Preorder:\n")
Preorder(T)
CountLeaf(T,s)
d=Depth(T)
printf("\n leaves=%d\n",s)
printf("\n depth=%d\n",d)
}
数据结构我认为主要有三个方面。1:抽象解释。
首先根据某个结构,利用自然语言进行描述,然后才能体现到代码上,如果你抽象解释看不懂,说明你的的数学知识不牢固,可以复习高中数学必修3中讲程序的那一节。
2:流程图。
根据自然语言的描述,把他体现在流程图上,注意流程图是学习数据结构的关键,数据结构不难,但很烦,他需要推理,往往一种情况又分另一种,红黑树就是一个例子。初期学习链表什么的较简单,但也不能忽略基础。
3:代码实现
有了流程图就万事具备了吗,NO。代码实现是一个大头,因为抽象,所以忽略了细节,往往这些细节能让你很头疼,比如选用什么数据类型,参数是引用,指针,常量等等?所以这里体现了你的代码操纵能力。