实现二叉树增删改查

    技术2024-06-16  71

    #include<stdio.h>#include<stdlib.h>typedef struct STree{ int date; struct STree *left,*right;}BSTNode;int BSTInsert(BSTNode *&bt,int k){ BSTNode *f,*p = bt; while(p != NULL) {  if(p->date = k)      return 0;  f = p;   //f指向*p结点的双亲结点  if(p->date < k)   p = p->right;  //在右子树中查找  else   p = p->left;  //在左子树中查找 } p = (BSTNode *)malloc(sizeof(BSTNode)); p->left = p->right = NULL; p->date = k; if(bt == NULL)  bt = p;     //原树为空时,*P作为根节点插入 else if(k < f->date)  f->left = p;   //插入*p作为*f的左孩子 else  f->right = p;   //插入*p作为*f的右孩子 return 1;}void CreateBST(BSTNode *&bt,int str[],int n){ bt = NULL; int i = 0; while(i < n) {  BSTInsert(bt,str[i]);  i++; }}void Display(BSTNode *bt){ if(bt != NULL) {  printf("%d ",bt->date);  Display(bt->left);  Display(bt->right); }}//二叉树删除节点思路:首先在二叉顺序树中查找关键字为k的结点p,用f指向其双亲结点//(1)如果p结点无右子树则用*p结点的左孩子替换它//(2)如果p结点无左子树则用*p结点的右孩子替换它//(3)如果p结点既有左子树又有右子树,则可以用*p结点的左子树的最右下结点替换它,也可以用*p结点的右子树的最左下结点替换它int BSTDelete(BSTNode *&bt,int k){ BSTNode *p = bt,*f,*r,*f1; f = NULL; while(p != NULL && p->date != k) {  f = p;  if(p->date > k)   p = p->left;  //在左子树中查找  else   p = p->right;  //在右子树中查找 } if(p == NULL)  return 0; else if (p->left == NULL)  //*p 为被删除结点,若它无左子树 {  if (f == NULL)   bt = p->right;  else if (f->left = p)  //p是双亲结点的左孩子,则用其右孩子替换它  {   f->left = p->right;   free(p);  }  else if (f->right = p)  //p是双亲结点的右孩子,则用其右孩子替换它  {   f->right = p->right;   free(p);  } } else if (p->right == NULL)  //*p 为被删除结点,若它无右子树 {  if(f == NULL)   bt->left;  if(f->left == p)  {   f->left = p->left;   free(p);  }else if (f->right == p)  {   f->right = p->left;   free(p);  } }else {  f1 = p;  r = p->left;  while(r->right != NULL)  {   f1 = r;   r = r->right;  }  if(f1->left == r)   f1->left = r->right;  else if (f1->right = r)   f1->left = p->left;  r->left = p->left;  r->right = p->right;

      if(f == NULL)   bt = r;  else if (f->left == p)   f->left = r;  else   f->right = r;  free(p); } return 1;}int main(){ BSTNode *bt = NULL; int a[10] = {1,3,5,7,8,12,16,23,45,56}; CreateBST(bt,a,10); Display(bt); return 0;}

    最新回复(0)