一、普通二叉树的建立
提到二叉树的建立,就不得不提一下“递归”,建立二叉树所采用的思想就是递归。
递归基本形式:
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);
}
}
}