树-中

二叉搜索树

1. 非空左子树的所有键值小于其根结点的键值
2. 非空右子树的所有键值小于其根结点的键值
3. 左右子树都是二叉搜素树

二叉搜索树操作函数

1.Posltion Find(ElementType X, BinTree BST); //从二叉搜索树BST中查找元素X,返回其所在结点的地址
2.Posltion FindMin(BinTree BST); //从二叉搜素树BST中查找并返回最小元素所在结点的地址
3.Posltion FindMax(BinTree BST); //从二叉搜索树BST中查找并返回最大元素所在结点的地址
4.BinTree Insert(ElementType X, BinTree BST);
5.BinTree Delete(ElementType X, BinTree BST);

Find 查找效率取决于树的高度

//尾递归
Position Find(ElementType X, BinTree BST) {
      if (!BST) return NULL;
      if (X > BST->Data )
            return Find(X, BST->Right); // 右子树中查找
      else if(X < BST->Data )
            return Find( X, BST->Left );
      else 
            return BST;    //查找成功,返回找到结点的地址
}
// 循环
Position IterFind(ElementType X, BinTree BST) {
      while (BST) {
            if (X > BST->Data)
                  BST = BST->Right;
            else if ( X <BST->Data )
                  BST = BST->Left;
            else
                  return BST;
      }
      return NULL;
}
  • Find min,max
Position FindMin (BinTree BST) {
      if (!BST) return NULL;   //空的二叉搜索树
      else if (!BST->Left)
            return BST;    //找到最左叶结点并返回
      else
            return FinMin( BST->Left );
}
/*-----------------------------*/
Position FindMax( BinTree BST ) {
      if (BST)
            while (BST->Right) BST=BST->Right;
      return BST
}
  • insert
BinTree Insert( ElementType X, BinTree BST ) {
       if( !BST ){
                         //若原树为空,生成并返回一个结点的二叉搜索树
             BST = malloc(sizeof(struct TreeNode));
             BST->Data = X;
             BST->Left = BST->Right = NULL;
       }             //开始找要插入元素的位置
        else if( X < BST->Data )
                BST->Left = Insert( X, BST->Left);
        else if( X > BST->Data )
                 BST->Right = Insert( X, BST->Right);
 return BST;
}
  • delete
BinTree Delete( ElementType X, BinTree BST ) { 
      Position Tmp;
      if( !BST ) printf("要删除的元素未找到");
      else if( X < BST->Data )
            BST->Left = Delete( X, BST->Left); /* 左子树递归删除 */
      else if( X > BST->Data )
            BST->Right = Delete( X, BST->Right); /* 右子树递归删除 */
      else if( BST->Left && BST->Right ) { /*被删除结点有左右两个子结点 */
             Tmp = FindMin( BST->Right );
 /*在右子树中找最小的元素填充删除结点*/
             BST->Data = Tmp->Data;
             BST->Right = Delete( BST->Data, BST->Right);
 /*在删除结点的右子树中删除最小元素*/
      } 
      else { /*被删除结点有一个或无子结点*/
            Tmp = BST;
            if( !BST->Left ) /* 有右孩子或无子结点*/
                  BST = BST->Right;
            else if( !BST->Right ) /*有左孩子或无子结点*/
                  BST = BST->Left;
            free( Tmp );
      }
 return BST;
}

平衡二叉树

posted @ 2020-08-01 21:42  小哑师兄  阅读(130)  评论(0编辑  收藏  举报