⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 二叉树.cpp

📁 自己写的数据结构代码
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;

#define maxsize 100000
#define STACK_INIT_SIZE 100000
#define STACKINCREMENT 2

typedef struct BiTNode
{
	ElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

struct SqStack
{
	BiTree *base;
	BiTree *top;
	int stacksize;
};

Status InitStack(SqStack &S)
{
	S.base=(BiTree *)malloc(STACK_INIT_SIZE*sizeof(BiTree));
	S.top=S.base;
	S.stacksize=STACK_INIT_SIZE;
	return OK;
}

Status Push(SqStack &S,BiTree e)
{
	if(S.top-S.base>=S.stacksize)
	{
		S.base=(BiTree *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(BiTree));
		S.top=S.base+S.stacksize;
		S.stacksize=S.stacksize+STACKINCREMENT;
	}
	*S.top++=e;
	
	return OK;
}

Status Pop(SqStack &S,BiTree &e)
{
	if(S.top==S.base) return ERROR;
	
	e=* --S.top;
	return OK;
}


Status StackEmpty(SqStack S)
{
	if(S.top==S.base) return OK;
	return ERROR;
}



Status InsertBiTree(BiTree &T,int e)
{
	if(!T) 
	{
		T=(BiTNode *)malloc(sizeof(BiTNode));
		T->data=e;
		T->lchild=NULL;
		T->rchild=NULL;
		return OK;
	}
	if(e<=T->data)
	{
		InsertBiTree(T->lchild,e);
		return OK;
	}
	else
	{
		InsertBiTree(T->rchild,e);
		return OK;
	}
	return OK;
}

Status PrintElement(ElemType e)
{
	printf("%d ",e);
	return OK;
}

Status PreOrderTraverse(BiTree T,Status(*Visit)(ElemType))
{
	if(T)
	{
		if(Visit(T->data))
			if(PreOrderTraverse(T->lchild,Visit)) 
				if(PreOrderTraverse(T->rchild,Visit))   return OK;
				return ERROR;
	}
	else return OK;
}

Status InOrderTraverse(BiTree T,Status(*Visit)(ElemType))
{
	if(T)
	{
		if(InOrderTraverse(T->lchild,Visit))
			if(Visit(T->data)) 
				if(InOrderTraverse(T->rchild,Visit))   return OK;
				return ERROR;
	}
	else return OK;
}

Status PostOrderTraverse(BiTree T,Status(*Visit)(ElemType))
{
	if(T)
	{
		if(PostOrderTraverse(T->lchild,Visit))
			if(PostOrderTraverse(T->rchild,Visit)) 
				if(Visit(T->data))   return OK;
				return ERROR;
	}
	else return OK;
}

Status SearchBiTree(BiTree &T,int e)
{
	if(!T) return ERROR;
	else if(e==T->data) return OK;
	else if(e<T->data)
	{
		return SearchBiTree(T->lchild,e);
	}
	else
	{
		return SearchBiTree(T->rchild,e);
	}
}


Status InOrder(BiTree T,Status(*Visit)(ElemType))
{
	SqStack s;
	BiTree p;
	InitStack(s);
	p=T;
	while(p || !StackEmpty(s))
	{
		if(p)  
		{
			Push(s,p);
			p=p->lchild;
		}
		else
		{
			Pop(s,p);
			if(!Visit(p->data))  return ERROR;
			p=p->rchild;
		}
	}
	return OK;
}
	
void Travel(BiTree T)                         /*层次遍历二叉树*/
{
    BiTree qu[maxsize];
    int front,rear;
    front=rear=0;
    if(T!=NULL)
        printf("%d ",T->data);
    rear++;
    qu[rear]=T;
    while(rear!=front)
    {   front=(front+1)%maxsize;
        T=qu[front];
        if(T->lchild!=NULL)
        {   printf("%d ",T->lchild->data);
            rear=(rear+1)%maxsize;
            qu[rear]=T->lchild;
        }
        if(T->rchild!=NULL)
        {   printf("%d ",T->rchild->data);
            rear=(rear+1)%maxsize;
            qu[rear]=T->rchild;
        }
    }
}  

	
int main()
{
	int a[100000];
	int n,i;
	int e;
	BiTree T;
	
	scanf("%d",&n);
	for(i=0;i<=n-1;i++)
	{
		scanf("%d",&a[i]);
	}
	T=NULL;
	for(i=0;i<=n-1;i++)
	{
		InsertBiTree(T,a[i]);
	}
	
	PreOrderTraverse(T,PrintElement);
	printf("\n");
	InOrderTraverse(T,PrintElement);
	printf("\n");
	PostOrderTraverse(T,PrintElement);
	printf("\n");
	
	for(i=1;i<=2;i++)
	{
		scanf("%d",&e);
		printf("%d\n",SearchBiTree(T,e));
	}

	scanf("%d",&e);
	InsertBiTree(T,e);
	
	PreOrderTraverse(T,PrintElement);
	printf("\n");
	InOrderTraverse(T,PrintElement);
	printf("\n");
	PostOrderTraverse(T,PrintElement);
	printf("\n");

	InOrder(T,PrintElement);
	printf("\n");

	Travel(T);
	printf("\n");
	return 0;
}






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -