第5章 树与二叉树
5.3 二叉树的遍历和线索二叉树
综合应用题 第11题
这题有点问题 删除后不能输出了。。搞不懂
#include <stdio.h>
#include <stdlib.h> //malloc所在头文件
#include <iostream>
#define MaxSize 100
using namespace std;
typedef int ElemType;
typedef struct BiTNode{//声明树
ElemType data; //数据域
struct BiTNode *lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;
BiTree PreInCreat(int a[],int b[],int l1,int h1,int l2,int h2)
{
int i=0;
BiTree root=(BiTNode *)malloc(sizeof(BiTNode));
root->data=a[l1];
for(i=l2;b[i]!=root->data;i++);
int llen=i-l2;
int rlen=h2-i;
if(llen)
root->lchild=PreInCreat(a,b,l1+1,l1+llen,l2,l2+llen-1);
else
root->lchild=NULL;
if(rlen)
root->rchild=PreInCreat(a,b,h1-rlen+1,h1,h2-rlen+1,h2);
else
root->rchild=NULL;
return root;
}
typedef struct{ //声明队列
BiTNode* queue[MaxSize];
int front,rear;
}SqQueue;
void InitQueue(SqQueue &Q)//初始化队列
{
Q.rear=Q.front=-1;
}
int EnQueuel(SqQueue &Q,BiTNode* x)//入队
{
if(Q.rear==MaxSize)
return 0;
Q.queue[Q.rear]=x;
Q.rear++;
//cout<<"i"<<endl;
return 1;
}
BiTNode* DeQueuel(SqQueue &Q)//出队
{
BiTNode* x;
if(Q.front==Q.rear)
return 0;
x=Q.queue[Q.front];
Q.front++;
// cout<<"o"<<endl;
return x;
}
bool QueueEmpty(SqQueue &Q)//判断队列是否为空
{
if(Q.front==Q.rear)
return true;
else
return false;
}
void DeleteXTree(BiTree &T)
{
if(T)
{
DeleteXTree(T->lchild);
DeleteXTree(T->rchild);
delete T;
}
}
int Search(BiTree &T,int x)
{
SqQueue Q;
InitQueue(Q);
if(T)
{
if(T->data==x)
{
DeleteXTree(T);
return 0;
}
BiTNode *p=T;
EnQueuel(Q,p);
while(!QueueEmpty(Q))
{
p=DeQueuel(Q);
if(p->lchild->data==x)
{
DeleteXTree(p->lchild);
p->lchild=NULL;
}
else
EnQueuel(Q,p->lchild);
if(p->rchild->data==x)
{
DeleteXTree(p->rchild);
p->rchild=NULL;
}
else
EnQueuel(Q,p->rchild);
}
}
return 0;
}
int main() {
int a[5]={4,2,1,3,5};
int b[5]={1,2,3,4,5};
BiTree B;
B=PreInCreat(a,b,0,4,0,4);
int x=0;
cout<<"输入x:";
cin>>x;
Search(B,x);
return 0;
}