前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[数据结构] 二叉搜索树的CURD(增删改查)操作

[数据结构] 二叉搜索树的CURD(增删改查)操作

作者头像
泰坦HW
发布2020-07-22 16:26:30
1.3K0
发布2020-07-22 16:26:30
举报
文章被收录于专栏:Titan笔记

介绍

对于二叉搜索树的查找指定元素、查找最大元素、查找最小元素、删除指定元素、插入元素等基础操作。除了删除操作外,基本上都是使用的非递归函数解决。

Code

代码语言:javascript
复制
#include<stdio.h>
#include<stdlib.h>
// 二叉搜索树的各种操作 By Titan

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode {
  int Data;
  Position Left;
  Position Right;
};

//插入操作
BinTree Insert(BinTree BST,int X) {
  if(!BST) {
    BST = (BinTree)malloc(sizeof(struct TNode));
    BST->Data=X;
    BST->Left=BST->Right=NULL;
  } else {
    BinTree Parent,Cur=BST;
    while(Cur) {
      Parent=Cur;
      if(Cur->Data > X) {
        Cur=Cur->Left;
      } else if(Cur->Data < X) {
        Cur=Cur->Right;
      } else {
        return BST;
      }
    }
    BinTree TempNode = (BinTree)malloc(sizeof(struct TNode));
    TempNode->Data=X;
    TempNode->Left=TempNode->Right=NULL;
    if(Parent->Data>X) {
      Parent->Left=TempNode;
    } else {
      Parent->Right=TempNode;
    }
  }
  return BST;
}
//查找操作
//基础查找
BinTree Find(BinTree BST,int X) {
  if(!BST) {
    return NULL;
  }
  BinTree Found=NULL;
  while(BST) {
    if(BST->Data > X ) {
      BST=BST->Left;
    } else if(BST->Data < X) {
      BST=BST->Right;
    } else if(BST->Data == X) {
      Found=BST;
      break;
    }
  }
  return Found;
}
//找最小值
BinTree FindMin(BinTree BST) {
  if(!BST) {
    return NULL;
  }
  while(BST->Left) {
    BST=BST->Left;
  }
  return BST;
}
//找最大值
BinTree FindMax(BinTree BST) {
  if(!BST) {
    return NULL;
  }
  while(BST->Right) {
    BST=BST->Right;
  }
  return BST;
}

// 删除操作
BinTree Delete(BinTree BST,int X) {
  Position Tmp;
  if( !BST ) {
    printf("Not Found\n");
  } else {
    if( X < BST->Data ) {
      BST->Left = Delete( BST->Left, X );
    } else if( X > BST->Data ) {
      BST->Right = Delete( BST->Right, X );
    } else {
      if( BST->Left && BST->Right ) {
        Tmp = FindMin( BST->Right );
        BST->Data = Tmp->Data;
        BST->Right = Delete( BST->Right, BST->Data );
      } else {
        if( !BST->Left ) {
          BST = BST->Right;
        } else {
          BST = BST->Left;
        }
      }
    }
  }
  return BST;
}

//先序遍历
void preOrder(BinTree BST) {
  if(BST) {
    printf("%d ",BST->Data);
    preOrder(BST->Left);
    preOrder(BST->Right);
  }
}


int main(void) {
  int n,tempX;
  BinTree BST=NULL;
  // 数据读入,建立二叉树
  scanf("%d",&n);
  for(int i=0; i<n; i++) {
    scanf("%d",&tempX);
    BST = Insert(BST,tempX);
  }
  // 先序遍历
  preOrder(BST);
  printf("\n");
  // 寻找某个元素
  int toFind;
  printf("请输入要查找的元素:");
  scanf("%d",&toFind);
  BinTree FoundNode = Find(BST,toFind);
  if(FoundNode) {
    printf("%d is Found.\n",toFind,FoundNode);
  } else {
    printf("%d Not Found!\n",toFind);
  }
  // 寻找最大值
  BinTree FoundMax=FindMax(BST);
  if(FoundMax) {
    printf("Max: %d.\n",FoundMax->Data,FoundMax);
  } else {
    printf("Find Max ERROR!\n");
  }
  // 寻找最小值
  BinTree FoundMin=FindMin(BST);
  if(FoundMin) {
    printf("Min: %d.\n",FoundMin->Data,FoundMin);
  } else {
    printf("Find Min ERROR!\n");
  }
  // 删除元素
  int target;
  printf("请输入要删除的元素: ");
  scanf("%d",&target);
  BST = Delete(BST,target);
  preOrder(BST);


}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020年03月17日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • Code
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档