二叉树排序——c语言实现

文章目录

    • 本文二叉树排序实现的功能
    • 二叉排序树的定义
    • 二叉排序树样例图解
    • c语言代码

本文二叉树排序实现的功能

输入一串数字,输出从小到大的排序。

二叉排序树的定义

二叉排序树要么是空二叉树,要么具有如下特点:

  1. 二叉排序树中,如果其根结点有左子树,那么左子树上所有结点的值都小于根结点的值;
  2. 二叉排序树中,如果其根结点有右子树,那么右子树上所有结点的值都大小根结点的值;
  3. 二叉排序树的左右子树也要求都是二叉排序树;
  4. 中序遍历二叉排序树,则是从小到大排序
    下面就是一颗二叉排序树:
    二叉树排序——c语言实现_第1张图片

二叉排序树样例图解

以4,5,7,2,3为例:
二叉树排序——c语言实现_第2张图片
二叉树排序——c语言实现_第3张图片

c语言代码

#include 
#include 
typedef struct BSTNode	//定义节点 
{
	int data;
	BSTNode *lchild;  //左孩子
	BSTNode *rchild;  //右孩子
}BSTNode, *BSTree;
 
 
bool Search(BSTree bst, int key, BSTree f, BSTree *p)  //查找成功时,p指向值为key的节点。如果查找失败,则p指向遍历的最后一个节点
{
	if (!bst)
	{
		*p = f;
		return false;
	}
	if (bst->data == key)  //查找成功,直接返回
	{
		*p = bst;
		return true;
	}
	else if (bst->data < key)
	{
		return Search(bst->rchild, key, bst, p);
	}
	return Search(bst->lchild, key, bst, p);
}
 
void InOderTraverse(BSTree bst)   //中序递归遍历二叉树
{
	if (NULL != bst)
	{
		InOderTraverse(bst->lchild);
		printf("%d ", bst->data);
		InOderTraverse(bst->rchild);
	}
}
 
static BSTNode* BuyNode(int data)   //生成一个节点并进行初始化
{
	BSTNode *pTmp = (BSTNode*)malloc(sizeof(BSTNode));
	if (NULL == pTmp)
	{
		exit(0);
	}
	pTmp->data = data;
	pTmp->lchild = NULL;
	pTmp->rchild = NULL;
	return pTmp;
}
 
bool Insert(BSTree *bst, int key)
{
	if (NULL == *bst)  //空树
	{
		*bst = BuyNode(key);   //插入根节点
		return true;
	}
	BSTNode *p;
	//先在二叉排序树中查找要插入的值是否已经存在
	if (!Search(*bst, key, NULL, &p))  //如果查找失败,则插入;此时p指向遍历的最后一个节点
	{
		BSTNode *pNew = BuyNode(key);
		if (key < p->data)  //将s作为p的左孩子
		{
			p->lchild = pNew;
		}
		else if (key > p->data)  //将s作为p的右孩子
		{
			p->rchild = pNew;
		}
		return true;  //插入成功
	}
	else
	{
		printf("\nThe node(%d) already exists.\n", key);//存在 
	}
	return false;
}

 
int main(void)
{
	BSTNode *root = NULL;
	int num,i,a;
	printf("请输入排序的个数:");
	scanf("%d",&num);
	printf("请输入排序数:");
	for(i=0;i<num;i++)
	{
		scanf("%d",&a);
		Insert(&root, a);
	} 
	printf("排序后的序列:");
	InOderTraverse(root);//中序输出 
	return 0;
}

二叉树排序——c语言实现_第4张图片

你可能感兴趣的:(数据结构,数据结构,二叉树)