王道考研 ++++ 二叉排序树(C语言 链表)

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct LTree
{
  int data;
  struct LTree *Lchild,*Rchild;
}LTree,*BiTree;

void InsertTree(BiTree *T,int number);
void Traversal(BiTree T);
void SearchElement(BiTree T,int number);
bool Delete(BiTree *p);
bool DeleteElement(BiTree *T,int number);
/*插入节点*/
void InsertTree(BiTree *T,int number)
{
  /*当节点为空时插入*/
  if(*T == NULL)
  {
    (*T) = (BiTree)malloc(sizeof(LTree));
    (*T)->data = number;
    (*T)->Lchild = (*T)->Rchild = NULL;//置左右节点子节点为空
    return ;
  }
  else if(number == (*T)->data)//树中已经存在值相同的节点
    return;//结束
  else if(number < (*T)->data)//元素小于当前节点向左子树走
    InsertTree(&(*T)->Lchild,number);
  else if(number > (*T)->data)//元素大于当前节点向右子树走
    InsertTree(&(*T)->Rchild,number);
}
/*中序遍历*/
void Traversal(BiTree T)
{
  if(T == NULL)return;
  Traversal(T->Lchild);
  printf("%d ",T->data);
  Traversal(T->Rchild);
}
/*查找元素*/
void SearchElement(BiTree T,int number)
{
  //当遍历到NULL(代表没找到节点)或 找到与树中与查找元素相同的节点时 结束查找
  while (T != NULL && T->data != number)
  {
    if(number < T->data)T = T->Lchild;//元素小于节点的值 向左走
    else T = T->Rchild;//否则 向右走
  }

  if(T == NULL)printf("没有此数!\n");
  else printf("查找成功!\n");
}
/*从二叉排序树中删除结点 p , 并重接它的左/右子树*/
bool Delete(BiTree *p){
    BiTree q, s;

    if ((*p)->Rchild == NULL)
   {  // 右子树空 则只需要重接它的左子树
        q = *p;
        *p = (*p)->Lchild;
        free(q);

    }
    else if ((*p)->Lchild == NULL)
    {  // 左子树空 则只需要重接它的右子树
        q = *p;
        *p = (*p)->Rchild;
        free(q);

    }
    else
    {  // 左右子树都不空
        q = *p;
        s = (*p)->Lchild;
        while (s->Rchild)
        {  // 向右到尽头,找到待删结点的前驱
            q = s;
            s = s->Rchild;
        }
        (*p)->data = s->data;  // s 指向被删除结点的直接前驱 (将被删结点前驱的值取代被删结点的值)
        if (q != *p)
            q->Rchild = s->Lchild;  // 重接 q 的右子树
        else
            q->Lchild = s->Lchild;  // 重接 q 的左子树
        free(s);
    }

    return true;
}

/**
 * 二叉排序树的删除
 * 当二叉排序树中存在关键字等于 number 的数据元素时,删除该数据元素并返回TRUE
 */
bool DeleteElement(BiTree *T, int number){
    if (!*T)return false;
    else
    {
        if (number == (*T)->data)
            Delete(T);
        else if (number < (*T)->data)
            DeleteElement(&(*T)->Lchild, number);
        else
            DeleteElement(&(*T)->Rchild, number);
    }
}
int main(int argc, char const *argv[]) {
  BiTree T = NULL;
  int number;

  printf("请输入数字,-1结束:");
  scanf("%d",&number);
  while (number != -1)
  {
    InsertTree(&T,number);
    scanf("%d",&number);
  }
  printf("中序遍历:");
  Traversal(T);
  printf("\n请输入查找数字:");
  scanf("%d",&number);
  SearchElement(T,number);
  printf("请输入删除数字:");
  scanf("%d",&number);
  DeleteElement(&T,number);
  printf("删后遍历:");
  Traversal(T);
  printf("\n");
  return 0;
}

发布了85 篇原创文章 · 获赞 40 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/WX_1218639030/article/details/98102065