数据结构之二叉排序树的建立

一、普通二叉树的建立

    提到二叉树的建立,就不得不提一下“递归”,建立二叉树所采用的思想就是递归。

递归基本形式:  

void recursion()
{
	if(递归结束条件)
	{
		表达式
	}
	else
	{
		表达式;
		recursion();
	}
}

    有了递归思想后,我们如何建立二叉树呢?比如建立如图的二叉树:


问题:发现此二叉树并不是完全二叉树,有的只有右孩子没有左孩子,这样的话,可以在输入时人为的假定一个虚拟的空孩子比如用65535表示空结点,具体如下:

代码实现:

/*****************普通二叉树的建立与遍历************/
void CreateBiTree(tNode *T)     /*二叉树的建立*/
{
	int ch;
	scanf("%d", &ch);
	if(0 == ch)
		*T = NULL;
	else
	{
		*T = (tNode)malloc(sizeof(node));
		if(!*T)
			exit(OVERFLOW);
		(*T)->data = ch;  
		CreateBiTree(&(*T)->lchild);  //构造左子树
		CreateBiTree(&(*T)->rchild);    //构造右子树
	}		
}

二、二叉排序树的建立

    二叉排序树的建立比普通二叉树多了一点就是在建立的过程中需要对插入进来的数据进行大小的判断,但是就是因为多了这么一点,所以不能在递归的过程中去输入数据并插入,而是应该先输入数据,再将数据插入。

    插入的过程中要将数据与树的根结点的值开始比较知道找到合适的位置插入,所以在插入数据的这一部分代码中可以使用递归算法。

                      

实现代码:

void creatBT(tNode *tree)   
{
	*tree = (tNode)malloc(sizeof(node));  //这已经给他的左右孩子分配了内存地址,所以要将他的左右孩子只想NULL
	(*tree)->lchild = NULL;
	(*tree)->rchild = NULL;
	
	int c ;
	scanf("%d",&c);
	
	if((*tree) != NULL && 65535 != c)   //以65535为结束标志
		(*tree)->data = c;   //创建根节点
		

	while(65535 != c)
	{
		scanf("%d",&c);
		if((*tree) != NULL && 65535 != c)	
			insertChild(tree, c);
	}

}

//写一个函数专门插入子孩子,采用递归,从根节点开始寻找合适的插入点
void insertChild(tNode *tree, int c)
{
	if(c < (*tree)->data)  
	{
		if( (*tree)->lchild == NULL )   //如果没有左孩子,直接将值赋给左孩子
		{
			(*tree)->lchild = (tNode)malloc(sizeof(node));  //这已经给他的左右孩子分配了内存地址,所以要将他的左右孩子只想NULL
			((*tree)->lchild)->lchild = NULL;
			((*tree)->lchild)->rchild = NULL;

			(*tree)->lchild->data = c;
		}
			
	
		else
		{
			insertChild(&((*tree)->lchild),c);		
		}
	}
	
	else
	{
		if( (*tree)->rchild == NULL )   //如果没有左孩子,直接将值赋给左孩子
		{
			(*tree)->rchild = (tNode)malloc(sizeof(node));   //这已经给他的左右孩子分配了内存地址,所以要将他的左右孩子只想NULL
			((*tree)->rchild)->lchild = NULL;
			((*tree)->rchild)->rchild = NULL;

			(*tree)->rchild->data = c;
		}
			
			
		else
		{
			insertChild(&((*tree)->rchild),c);		
		}
	}
}

  • 47
    点赞
  • 157
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值