二叉树的常用操作
二叉树的结构
typedef struct node* BST;
typedef struct node* position;
struct node
{
int data;
position Left;
position Right;
};
建立空树
BST makeEmpty(BST T) //建立一颗空的二叉搜索树 ,如果二叉树不为空,可以清空树;
{
if(T)
{
makeEmpty(T->Left);
makeEmpty(T->Right);
free(T);
}
return NULL;
}
查找树中元素的位置
position findBST(BST T ,int X)
{
if(T==NULL)
{
return NULL;
}
if(T->data > X)
{
return findBST(T->Left,X);
}
else if(T->data < X)
{
return findBST(T->Right);
}
else
{
return T;
}
}
查找二叉树最大元素
position findMax(BST T) //递归实现
{
if(T==NULL)
{
return NULL;
}
if(T->Right)
{
findMax(T->Right);
}
else
{
return T;
}
}
最小元素的查找
position findMin(BST T) //循环实现
{
if(T!==NULL)
while(T->Left)
T = T->Left;
return T;
}
向二叉树中插入元素
BST InsertBST(BST T,int X)
{
if(T==NULL)
{
T = (BST)malloc(sizeof(struct node));
if (!T)
{
return NULL;
}
T->data = X;
T->Left = T->Right = NULL;
}
else if(T->data > X)
{
T->Left = InsertBST(T->Left,X);
}
else if(T->data <X)
{
T->Right = InsertBST(T->Right,X);
}
return T;
}
二叉搜索树的删除操作(重点)
用find 函数查找到要删除元素的位置;
分3种情况 :
- 被删除的节点是叶节点 ,可之间删除,让其父节点指针为NULL
- 被删除的节点有一个子节点,让其父节点指向子节点;
- 被删除的节点有2个子节点,可选择右子树的最小元素,或者左子树的最大元素;代替被删除的元素;这样就把要删除的节点变成了1或2 的情况
这样做的目的是使二叉树仍为二叉搜索树;
删除操作
position DeleteBST(BST T,int X)
{
position Tmp;
if(T == NULL)
{
printf("树为空\n");
return NULL;
}
else if(T->data < X)
{
T->Right = DeleteBST(T->Right,X);
}
else if(T->data > X)
{
T->Left = DeleteBST(T->Left,X);
}
else if(T->Left&& T->Right) // 要删除的节点有两个子节点
{
Tmp = findMin(T->Right); //找到右子树的最小元素代替被删除的节点;
// Tmp= findMax(T->Left); 也可以找到左子树的最大元素代替被删除的节点;
T->data = Tmp->data;
T->Right = DeleteBST(T->Right,T->data); // 删除右子树的最小元素;
}
else
{
Tmp = T;
if (T->Left == NULL) //被删除的节点有左子树
{
T = T->Right;
}
else if (T->Right == NULL) //被删除的节点有右子树
{
T = T->Left;
}
free(Tmp); // 删除节点
}
return T;
}