//二叉树的插入操作
int BST_Insert(BSTree &T,TElemType data)
{
if (T == NULL)
{
T = (BSTree)malloc(sizeof(BSTNode));
T->data = data;
T->lchild = NULL;
T->rchild = NULL;
return 1;
}
else if(data < T->data)
{
return BST_Insert(T->lchild,data);
}
return BST_Insert(T->rchild,data);
}
//二叉树的遍历
void LevelOrder(BSTree T)
{
queue<BSTNOde> q;
if(T != NULL)
{
BSTNode temp;
q.push(*T);
while(!q.empty())
{
temp = q.front();
q.pop();
cout<<temp.data<<" ";
if(temp.lchild !=NULL)
q.push(*temp.lchild!=NULL)
}
}
}
//二叉树的查找
BSTNode *BST_Search(BSTree T,TElemType key)
{
BSTNode *cur = T;
while(cur&&key!=cur->data)
{
if(key<cur->data)
{
cur = cur->lchild;
}
else
{
cur = cur->rchild;
}
}
return cur;
}
//二叉树的删除(重点)
bool BST_Delete(BSTree &T,TEleType key)
{
BSTNode* cur = T;
BSTnode* cur_par = NULL;//当前节点的双亲结点
while(cur&&key !=cur->data)//寻找待删除的结点
{
if(key<cur->data)
{
cur_par =cur;//记录当前结点的双亲结点
cur = cur->lchild;
}
else
{
cur_par = cur;
cur = cur->rchild;
}
}
if(cur)//找到了之后
{
if(cur->lchild == NULL &&cur->rchild ==NULL)//如果为叶子结点
{
if(cur == T)//如果是根结点
{
T == NULL;
}
else if(cur_par->lchild == cur) //如果要删除的结点是cur_par的左孩子
{
cur_par->lchild = NULL;
}
else
{
cur_par->rchild = NULL;
}
else if (cur->lchild == NULL||cur->rchild ==NULL)
{
if(cur == T)
{
if(cur->lchild)
{
T = cur->lchild;
}
else
{
T = cur->rchild;
}
}
else//如果不是根结点
{
if(cur_par->lchild == cur&&cur->lchild) //cur为cur的双亲结点的左孩子且有右孩子
{
cur_par->lchild = cur->lchild; //此时就让其双亲左孩子指向其左孩子
}
else if(cur_par->lchild ==cur&&cur->rchild)//cur为双亲的左节点且有右孩子
{
cur_par->lchild = cur->rchild;//就让其双亲左孩子指向右孩子
}
else//最后一种情况,cur为其双亲右孩子,cur有右孩子
{
cur_par->rchild = cur->rchild;//让cur双亲右孩子指针指向cur的右孩子
}
}
else//最后一种情况,双支结点,这时候可以选择其中序遍历的
//直接前驱后继来进行交换,之后直接删除交换的前驱或者后记
{
BSTNode* temp = cur;//记录需要删除的系欸但,接下来要进行交换数据与
cur_par = cur;//用于找到temp的直接后继,则cur就为temp右子树最左的左孩子
cur = cur->rchild; //右子树
while(cur->lchild)//寻找直接后继,即右子树当中最左边的左孩子
{
cur_par = cur;
cur = cur->lchild;
}
temp->data = cur->data;//交换数据域
if(cur_par ==temp)//待删除结点的右子树没有左子树,即右子树根结点即为待删除的结点
{
cur_par->rchild = cur->rchild;
}
else {
cur_par->lchild = cur->rchild;//将cur的右子树给双亲结点
}
}
free(cur);
return true;
}
return false;
}
考研系列之数据结构——二叉树的插入、删除、遍历、查找操作
于 2022-03-21 19:09:07 首次发布