本关任务:实现二叉排序树结点创建和数据插入函数。并完成中序和先序遍历函数,通过输出结果验证二叉排序树是否正确创建。
#include <stdio.h>
#include <stdlib.h>
//数据结构定义
struct node
{
int data ;
struct node *lchild ,*rchild ;
};
typedef struct node *pTree;
/*第一关*/
/*1.创建一个二叉树结点,值为element*/
pTree createTreeNode(int element)
{
pTree p= (struct node*)malloc(sizeof(struct node));
p->data = element;
p->lchild = NULL;
p->rchild = NULL;
return p;
}
/*2.在二叉排序树中插入一个数据元素,若二叉树为空,则新建根节点*/
pTree insertData(int x , pTree T)
{
pTree node = createTreeNode(x);
if(T == NULL)return node;
pTree p = T,q = T;
while(q != NULL){//遍历寻找能够插入的位置
if(q->data == x)return T;
if(q->data > x){//x偏小 向左子树遍历
p = q;
q = q->lchild;
}else{//x偏大 向右子树遍历
p = q;
q = q->rchild;
}
}
if(node->data < p->data)p->lchild = node;
else p->rchild = node;
return T;
}
/*3.先序遍历和中序遍历函数*/
void preOrder( pTree T)//先输出根,再遍历左右子树
{
if(T == NULL)return;
printf("%d ",T->data);
preOrder(T->lchild);
preOrder(T->rchild);
return;
}
void inOrder( pTree T)//先遍历左子树,然后输出根,再遍历右子树
{
if(T == NULL)return ;
inOrder(T->lchild);
printf("%d ",T->data);
inOrder(T->rchild);
return;
}
/*第二关*/
/*1.在二叉排序树T中查找最小值,返回该结点*/
pTree findMin(pTree T)
{
if(T == NULL)return NULL;
pTree p = T;
while(p->lchild != NULL){
p = p->lchild;
}
return p;
}
/*2.在二叉排序树T中查找最大值,返回该结点*/
pTree findMax(pTree T)
{
if(T == NULL)return NULL;
pTree p = T;
while(p->rchild != NULL){
p = p->rchild;
}
return p;
}
/*3.在二叉排序树T中查找指定数据元素,若未找到,则返回NULL*/
pTree findData(pTree T, int element)
{
pTree p = T;
while(p != NULL){
if(element == p->data)return p;
if(element < p->data)p = p->lchild;
else p = p->rchild;
}
return p;
}
/*第三关*/
/*在二叉排序树T中删除指定元素的结点,若删除成功则返回该结点,否则返回NULL*/
pTree deleteData(pTree T,int element)
{
if(T == NULL || findData(T, element) == NULL) return NULL;
if(T -> data == element)
{
if(T -> rchild != NULL)
{
pTree r = T -> rchild;
findMin(r) -> lchild = T -> lchild;
T -> data = r -> data;
T -> rchild = r -> rchild;
T -> lchild = r -> lchild;
free(r);
return T;
}
else if(T -> lchild != NULL)
{
pTree r = T -> lchild;
findMax(r) -> rchild = T -> rchild;
T -> data = r -> data;
T -> rchild = r -> rchild;
T -> lchild = r -> lchild;
free(r);
return T;
}
else return NULL;
}
else if(T -> data > element)
{
T -> lchild = deleteData(T -> rchild, element);
}
else
{
T -> rchild = deleteData(T -> rchild, element);
}
return T;
}