C语言二叉排序树基本操作

定义:

 二叉排序树是一棵特殊的二叉树。其必须满足:要么为空树或者树上任一结点,其值大于等于其左子树上的任意结点值(左子树非空),且小于其右子树上任意结点的值(右子树非空),其左右子树也满足该定义。

结构体:

typedef struct node									//二叉树结构体			
{
	struct node * lchild;
	struct node * rchild;
	int data;
}Node;
创建二叉排序树:

 创建的过程是先进行查找,然后在合适位置将结点插入,所以结点插入完毕则创建成功。

int CreateNode(int s,Node * & p)						//创建二叉排序树的结点
{
	if (p)
	{
		if (s<p->data) return CreateNode(s,p->lchild);	//目标结点在左子树中
		else if (s==p->data)return 0;					//已存在该结点,无需插入
		else return CreateNode(s,p->rchild);			//目标结点在右子树中
	}
	else												//不存在该结点,则插入
	{
		p = (Node *)malloc(sizeof(Node));
		p->data = s;
		p->lchild = NULL;
		p->rchild = NULL;
		return 1;
	}
}

int BuildBST(int input[],int length,Node * & T)			//建立二叉排序树
{
	int node_nume =0;									//树中不重复的结点数结点
	for (int i = 0; i < length; i++)
		node_nume+=CreateNode(input[i],T);
	return node_nume;
}
删除二叉排序树:

void DeletTree(Node * p)								//删除树
{
	if (p)
	{
		DeletTree(p->lchild);
		DeletTree(p->rchild);
		free(p);
	}
}

二叉树的递归遍历核心代码:

void PreOder(Node * p,int &node_num)					//后序遍历
{
	if (p)
	{
		printf("%d",p->data);
		PreOder(p->lchild,node_num);
		PreOder(p->rchild,node_num);
	}
}

void InOder(Node * p,int &node_num)						//中序遍历
{
	if (p)
	{
		InOder(p->lchild,node_num);
		printf("%d",p->data);
		InOder(p->rchild,node_num);
	}
}

void PostOder(Node * p,int &node_num)					//后序遍历
{
	if (p)
	{
		PostOder(p->lchild,node_num);
		PostOder(p->rchild,node_num);
		printf("%d",p->data);
	}
}

下面是输入n个整数,建立二叉排序树,并输出各项遍历序列的主函数:

int main()
{
	int n;												//输入序列的长度
	int input[100];										//输入序列
	int node_num;										//树中不重复结点数
	Node * Tree =NULL;
	while (scanf("%d",&n)!=EOF)
	{
		for (int i = 0; i < n; i++)
			scanf("%d",&input[i]);
		
		n=BuildBST(input,n,Tree);						//建立排序树

		printf("前序为:");
		node_num =n;
		PreOder(Tree,node_num);							//先序遍历
		printf("中序为:");
		node_num =n;
		InOder(Tree,node_num);							//中序遍历
		printf("后序为:");
		node_num =n;
		PostOder(Tree,node_num);						//后序遍历

		DeletTree(Tree);								//删除树
		
	}
	return 0;
}


黑框输出运行结果:



后记:

 遍历运用很复杂,要多看些应用实例


  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值