二叉搜索树的插入与删除实现

  1. BinTree Insert( BinTree BST, ElementType X )
  2. {
  3.     if( !BST ){ /* 若原树为空,生成并返回一个结点的二叉搜索树 */
  4.         BST = (BinTree)malloc(sizeof(struct TNode));
  5.         BST->Data = X;
  6.         BST->Left = BST->Right = NULL;
  7.     }
  8.     else /* 开始找要插入元素的位置 */
  9.         if( X < BST->Data )
  10.             BST->Left = Insert( BST->Left, X );   /*递归插入左子树*/
  11.         else  if( X > BST->Data )
  12.             BST->Right = Insert( BST->Right, X ); /*递归插入右子树*/
  13.         /* else X已经存在,什么都不做 */
  14.     }
  15.     return BST;
  16. }
  17.  
  18. BinTree Delete( BinTree BST, ElementType X ) 
  19.     Position Tmp; 
  20.  
  21.     if( !BST ) 
  22.         printf("要删除的元素未找到"); 
  23.     else {
  24.         if( X < BST->Data ) 
  25.             BST->Left = Delete( BST->Left, X );   /* 从左子树递归删除 */
  26.         else if( X > BST->Data ) 
  27.             BST->Right = Delete( BST->Right, X ); /* 从右子树递归删除 */
  28.         else /* BST就是要删除的结点 */
  29.             /* 如果被删除结点有左右两个子结点 */ 
  30.             if( BST->Left && BST->Right ) {
  31.                 /* 从右子树中找最小的元素填充删除结点 */
  32.                 Tmp = FindMin( BST->Right );
  33.                 BST->Data = Tmp->Data;
  34.                 /* 从右子树中删除最小元素 */
  35.                 BST->Right = Delete( BST->Right, BST->Data );
  36.             }
  37.             else /* 被删除结点有一个或无子结点 */
  38.                 Tmp = BST; 
  39.                 if( !BST->Left )       /* 只有右孩子或无子结点 */
  40.                     BST = BST->Right; 
  41.                 else                   /* 只有左孩子 */
  42.                     BST = BST->Left;
  43.                 free( Tmp );
  44.             }
  45.         }
  46.     }
  47.     return BST;
  48. }

转载于:https://www.cnblogs.com/lzdxh027/p/11336598.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值