zoukankan      html  css  js  c++  java
  • 树-中

    二叉搜索树

    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;
    }
    

    平衡二叉树

  • 相关阅读:
    eclipse添加xsd
    Ibatis 后台打印完整的sql语句
    eclipse 将文件夹作为sourcefolder
    git:hook declined FATAL: W refs/heads DENIED by fallthru error
    单点登陆CAS安装过程中可能遇到的问题
    单点登录的原理与CAS技术的研究
    【转载】软件开发模式对比(瀑布、迭代、螺旋、敏捷)
    UML工具选择
    UML 用例图,时序图,活动图的定义以及区别
    基于UML的需求分析和系统设计个人体会
  • 原文地址:https://www.cnblogs.com/Alex3O/p/13423357.html
Copyright © 2011-2022 走看看