/*  二叉查找树 基本操作  */
#include <stdio.h>
#include <stdlib.h> typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode {
ElementType Element;
BinTree Left;
  BinTree Right;
}; int PreOrderJudge( BinTree T ); /* 判断是否满足BST */
void PreorderTraversal( BinTree BST ); /* 先序遍历 */
void InorderTraversal( BinTree BST ); /* 中序遍历 */ BinTree Insert( BinTree BST, ElementType X );
BinTree Delete( BinTree BST, ElementType X );
Position Find( BinTree BST, ElementType X );
Position FindMin( BinTree BST );
Position FindMax( BinTree BST );
int main() {   
BinTree BST, MinP, MaxP, Tmp;   
ElementType X;  
 int N, i;      /* Insert node to build a BST */
BST = NULL;
  scanf("%d", &N);
  for ( i = ; i < N; i++ ) {
    scanf("%d", &X);
    BST = Insert(BST, X);
  }
  printf("Preorder: ");
  PreorderTraversal(BST);
  printf("\nInorder: ");
  InorderTraversal(BST);   
  printf("\n");  
  
  MinP = FindMin(BST);     
  MaxP = FindMax(BST);  
  scanf("%d", &N); /* search N numebr */
  for ( i = ; i < N; i++ ) {
    scanf("%d", &X);
    Tmp = Find(BST, X);
    if ( Tmp == NULL )
      printf("%d is not found\n", X);
    else {
      printf("%d is found\n", Tmp->Element);
      if ( Tmp == MinP )
        printf("%d is the smallest key\n", Tmp->Element);
      if ( Tmp == MaxP )
        printf("%d is the largest key\n", Tmp->Element);
    }
  } /* for */ /* Delete all nodes */
  scanf("%d", &N);
  for ( i = ; i < N; i++ ) {
    scanf("%d", &X);
    BST = Delete(BST, X);
  }
  return ;
} BinTree Insert( BinTree BST, ElementType X )
{
  if ( !BST ) {
    /* 若原树为空,生成并返回一个结点的二叉搜索树 */
    BST = (BinTree)malloc(sizeof(struct TNode));
    BST->Element = X;
    BST->Left = BST->Right = NULL;
  } else {
    /* 开始找要插入元素的位置 */
    if ( X < BST->Element )
      BST->Left = Insert( BST->Left, X ); /*递归插入左子树*/
    else if ( X > BST->Element )
      BST->Right = Insert( BST->Right, X ); /*递归插入右子树*/
      /* else X已经存在,什么都不做 */
  }
  return BST;
} BinTree Delete( BinTree BST, ElementType X )
{
  Position Tmp;   if ( !BST )
    printf("Not Found\n");
  else {
    if ( X < BST->Element )
      BST->Left = Delete( BST->Left, X ); /* 从左子树递归删除 */
    else if ( X > BST->Element )
      BST->Right = Delete( BST->Right, X ); /* 从右子树递归删除 */
    else { /* BST就是要删除的结点 */
      /* 如果被删除结点有左右两个子结点 */
      if ( BST->Left && BST->Right ) {
        /* 从右子树中找最小的元素填充删除结点 */
        Tmp = FindMin( BST->Right );
        BST->Element = Tmp->Element;
        /* 从右子树中删除最小元素 */
        BST->Right = Delete( BST->Right, BST->Element );
      } else {
        /* 被删除结点有一个或无子结点 */
        Tmp = BST;
        if( !BST->Left ) /* 只有右孩子或无子结点 */
          BST = BST->Right;
        else /* 只有左孩子 */
          BST = BST->Left;
        free( Tmp );
      }
    } /* else */
  }
  return BST;
} Position Find( BinTree BST , ElementType X )
{
  if ( !BST ) return NULL; /*查找失败*/
  if ( X > BST->Element )
    return Find( BST->Right, X ); /*在右子树中继续查找*/
  else if ( X < BST->Element )
    return Find( BST->Left, X); /*在左子树中继续查找*/
  else /* X == BST->Element */
    return BST; /*查找成功,返回结点的找到结点的地址*/
} Position FindMin( BinTree BST )
{
  if ( !BST ) return NULL; /*空的二叉搜索树,返回NULL*/
  else if ( !BST->Left )
    return BST; /*找到最左叶结点并返回*/
  else
    return FindMin( BST->Left ); /*沿左分支继续查找*/
} Position FindMax( BinTree BST )
{
  if ( BST ) {
    while( BST->Right )
      BST = BST->Right;
      /*沿右分支继续查找,直到最右叶结点*/
    return BST;
  }
} void InorderTraversal( BinTree BST )
{
  if ( BST ) {
    InorderTraversal( BST->Left );
    printf("%d", BST->Element);
    InorderTraversal( BST->Right );
  }
} void PreorderTraversal( BinTree BT )
{
  if( BT ) {
    printf("%d ", BT->Element);
    PreorderTraversal( BT->Left );
    PreorderTraversal( BT->Right );
  }
} void PreOrderJudge( BinTree BST )
{
  if ( BST == NULL ) {
    printf("Empty Tree!");
    return;
  } else if ( BST ) {
    if ( BST->Left ) {
      /* 左儿子更大 */
      if( BST->Left->Element >= BST->Element )
        return;
    }
    if ( BST->Right ) {
     /* 右儿子更小 */
      if ( BST->Right->Element <= BST->Element )
        return;
    }
    PreOrderJudge( BST->Left );
    PreOrderJudge( BST->Right );
  }
}

PTA-BinarySearchTree BasicOperation的更多相关文章

  1. 二叉搜索树BinarySearchTree(C实现)

    头文件—————————————————————————————— #ifndef _BINARY_SEARCH_TREE_H_ #define _BINARY_SEARCH_TREE_H_ #inc ...

  2. 浙大PTA - - 堆中的路径

    题目链接:https://pta.patest.cn/pta/test/1342/exam/4/question/21731 本题即考察最小堆的基本操作: #include "iostrea ...

  3. 浙大PTA - - File Transfer

    题目链接:https://pta.patest.cn/pta/test/1342/exam/4/question/21732 #include "iostream" #includ ...

  4. ERROR<53761> - Plugins - conn=-1 op=-1 msgId=-1 - Connection Bind through PTA failed (91). Retrying...

    LDAP6.3在DSCC控制台启动实例完成,但是操作状态显示“意外错误”,查看日志如下: 04/May/2016:21:10:39 +0800] - Sun-Java(tm)-System-Direc ...

  5. PTA中提交Java程序的一些套路

    201708新版改版说明 PTA与2017年8月已升级成新版,域名改为https://pintia.cn/,官方建议使用Firefox与Chrome浏览器. 旧版 PTA 用户首次在新版系统登录时,请 ...

  6. PTA分享码-Java

    主要用于Java语法练习,非竞赛类题目.   1. Java入门          959dbf0b7729daa61d379ec95fb8ddb0   2. Java基本语法   23bd8870e ...

  7. 二叉树终极教程--BinarySearchTree

    BinarySearchTreeMap 的 实现 public interface Map<K extends Comparable<K>, V> { void put(K k ...

  8. C语言第一次实验报告————PTA实验1.2.3内容

    一.PTA实验作业 题目1.温度转换 本题要求编写程序,计算华氏温度100°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1.实验代 ...

  9. PTA题---求两个有序序列中位数所体现的思想。

    ---恢复内容开始--- 近日,在做PTA题目时,遇到了一个这样的题,困扰了很久.题目如下:已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数.有序序列A​0​​,A​1​​, ...

  10. 第十四,十五周PTA作业

    1.第十四周part1 7-3 #include<stdio.h> int main() { int n; scanf("%d",&n); int a[n]; ...

随机推荐

  1. 深入理解net core中的依赖注入、Singleton、Scoped、Transient(一)

    相关文章: 深入理解net core中的依赖注入.Singleton.Scoped.Transient(一) 深入理解net core中的依赖注入.Singleton.Scoped.Transient ...

  2. Angularjs 表格插件的使用

    对于相关的table组件可以使用:UI Grid (ng-grid),ng-table,smart table,Angular-Datatables,tablelite,kendo-ui中的grid. ...

  3. gitlab上如何添加二进制文件(设计文档)

    想将设计文档(原型设计图,UML设计图等)放到gitlab上,以供团队其他成员查看.将这些二进制文件跟源码一样纳入git管控显然是不合适的.经过一番摸索,找到了如何管理项目文档的方法. 根据Stack ...

  4. Linux man 命令详细介绍

    知道linux帮助文件(man-pages,手册页)一般放在,$MANPATH/man 目录下面,而且按照领域与语言放到不同的目录里面. 看了上一章,要找那个命令使用相关手册,只要我们按照领域区分,到 ...

  5. 转:iBatis简单入门教程

    iBatis 简介: iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快.如果不需要太多复杂的功能,iBatis 是能够满足 ...

  6. C++:sprintf()的用法(转)

    转:http://blog.csdn.net/masikkk/article/details/5634886 更多:http://blog.csdn.net/zjuwispersure/article ...

  7. Xman资格选拔赛-web

    variacover 这道题一打开就是源码,主要就是根据源码构造url.其中,它接收的参数只有b,但源码中要获取flag的关键参数是a[0].parse_str()函数的作用是把查询字符串解析到变量中 ...

  8. AltiumDesigner元器件搜索中英文对照

    个人常用 扬声器 spearker 计量表(电流表,电压表) meter 变压器 Trans CT 肖特基二极管 D Schotty 额外补充 英文名称       中文释义 2N3904  NPN型 ...

  9. 面向对象程序设计_Task5_Calculator1.5.0

    The 3rd part of the Calculator program _ FILE I/O 题目链接:第五次作业(计算器第三步) github链接:Calculator_1.5.0 第五次作业 ...

  10. 囧啊!!时间戳转化为时间出错php

    最近写了一个api,测试也没发现啥问题.可是上线之后发现有时api的返回结果不正确.为什么呢? 调我接口的同学给了两个调用示例,理论上两个的结果应该一致,实际结果却不一致. api调用带了一个时间戳参 ...