数据结构之二叉排序树及二叉树的遍历

本文解决的问题是:

构建一个二叉排序树,随机产生20个树,并实现该二叉树的三种深度遍历(递归和非递归)和一种广度遍历。

实现代码如下:

#include<stdio.h>
#include<stdlib.h>

#define MaxSize 100
typedef struct btnode
{
    int data;
	int BF;
    struct btnode *lchild,*rchild;
}Btnode,*bitree;
//定义队列
typedef struct{
	bitree data[MaxSize];
	int front,rear;
}SqQueue;
//定义栈
typedef struct{
	bitree data[MaxSize];
	int top;
}SqStack;

//创建二叉树
bitree creatTree(bitree root)
{
	int i;
	int temp;
	bitree r,s,pre;
	for(i=0;i<20;i++)
	{
		temp=rand()%90+11;
		printf("本次插入的是:%d\n",temp);
		r=(bitree)malloc(sizeof(btnode));
		r->data=temp;
		r->lchild=NULL;
		r->rchild=NULL;
		pre = NULL;
		s=root;
		if(root->data == NULL)
		{
			root=r;
			continue;
		}
		while(s)
		{
			if(temp==s->data)
			{
				//当前结点与新传入的值相等
				i--;
				pre=NULL;
				printf("本次%d为重复结点,请重新生成结点!!\n",temp);
				break;
			}else if(temp<s->data)
			{
				//当前结点大于新传入值,遍历左结点
				pre = s;
				s = s->lchild;
			}else{
				//当前结点小于新传入值,遍历右结点
				pre = s;
				s = s->rchild;
			}
		}
		if(pre != NULL)
		{
			//找到结点(父节点)插入位置
			if(temp<pre->data)
			{
				//插入左子树
				pre->lchild = r;
			}else{
				//插入右子树
				pre->rchild = r;
			}	
		}	
	}
	return root;
}
//前序遍历递归
void preErgodic_recu(bitree root)
{
	if(root)
	{
		printf("%d ",root->data);
		preErgodic_recu(root->lchild);
		preErgodic_recu(root->rchild);
	}
}
//前序遍历非递归
void preErgodic_recu_no(bitree root)
{
	SqStack q;
	q.top=0;
	q.data[q.top]=root;
	bitree p=root;
	while(p||q.top != 0)
	{
		if(p)
		{
			printf("%d ",p->data);
			q.data[q.top++] = p;
			p=p->lchild;
		}else{
			p=q.data[--q.top];
			p=p->rchild;
		}
	}
}
//中序遍历递归
void midErgodic_recu(bitree root)
{
	if(root)
	{
		midErgodic_recu(root->lchild);
		printf("%d ",root->data);
		midErgodic_recu(root->rchild);
	}
}
//中序遍历非递归
void midErgodic_recu_no(bitree root)
{
	SqStack q;
	q.top=0;
	q.data[q.top]=root;
	bitree p=root;
	while(p||q.top != 0)
	{
		if(p)
		{
			q.data[q.top++] = p;
			p=p->lchild;
		}else{
			p=q.data[--q.top];
			printf("%d ",p->data);
			p=p->rchild;
		}
	}
}
//后序遍历递归
void postErgodic_recu(bitree root)
{
	if(root)
	{
		postErgodic_recu(root->lchild);
		postErgodic_recu(root->rchild);
		printf("%d ",root->data);
	}
}
//后序遍历非递归
void postErgodic_recu_no(bitree root)
{
	SqStack q;
	q.top=0;
	q.data[q.top]=root;
	bitree p=root;
	bitree r=NULL;
	while(p||q.top != 0)
	{
		if(p)
		{
			q.data[q.top++] = p;
			p=p->lchild;
		}else{
			p=q.data[q.top-1];
			if(p->rchild&&p->rchild != r)
			{
				p=p->rchild;
				q.data[q.top++] = p;
				p=p->lchild;
			}else
			{
				p=q.data[--q.top];
				printf("%d ",p->data);
				r=p;
				p=NULL;
			}
		}
	}
}
//入队
void push_queue(SqQueue *q,bitree root)
{
	q->data[q->rear]=root;
	q->rear++;
}
//出队
bitree pop_queue(SqQueue *q)
{
	return q->data[q->front++];
}
//广度遍历
void breafthTraversal(bitree root)
{
	SqQueue q;
	q.front = q.rear = 0;
	if(!root)
	{
		printf("二叉树为空!!\n");
		return;
	}
	//根节点入队
	push_queue(&q,root);
	while(q.front != q.rear)
	{
		bitree temp=pop_queue(&q);
		printf("%d ",temp->data);
		if(temp->lchild != NULL)
		{
			push_queue(&q,temp->lchild);
		}
		if(temp->rchild != NULL)
		{
			push_queue(&q,temp->rchild);
		}
	}

}

int main()
{
	bitree root;
	root=(bitree)malloc(sizeof(btnode));
	root->data=NULL;
	root=creatTree(root);
	//打印树
	/*****************************三种深度遍历******************************************/
	/******************1.1 前序深度遍历*****************/
	printf("前序遍历--递归:\n");
	preErgodic_recu(root);
	printf("\n");
	printf("前序遍历--非递归:\n");
	preErgodic_recu_no(root);
	printf("\n");
	printf("\n");
	printf("\n");
	/******************1.2 中序深度遍历*****************/
	printf("中序遍历--递归:\n");
	midErgodic_recu(root);
	printf("\n");
	printf("中序遍历--非递归:\n");
	midErgodic_recu_no(root);
	printf("\n");
	printf("\n");
	printf("\n");
	/******************1.3 后序深度遍历*****************/
	printf("后序遍历--递归:\n");
	postErgodic_recu(root);
	printf("\n");
	printf("后序遍历--非递归:\n");
	postErgodic_recu_no(root);
	printf("\n");
	printf("\n");
	printf("\n");
	/*****************************一种广度遍历******************************************/
	printf("广度遍历的结果为:\n");
	breafthTraversal(root);
	printf("\n");
	return 0;
}
如有疑问,请及时提出,谢谢!

---------------------------------------------------------------------------------------------------------------------


猜你喜欢

转载自blog.csdn.net/zly412934578/article/details/79146922