二叉排序树(BST)构造与应用

                                              二叉排序树(BST)构造与应用

    

      本文取自《数据结构与算法》(C语言版)(第三版),出版社是清华大学出版社。

      本博文作为学习资料整理。源代码是VC++ 6.0上可执行程序,我挪到了VS2010中执行。

      在VS2010中新建C++ Win32 控制台应用程序项目,创建结果截图:

          二叉排序树(BST)构造与应用_第1张图片


    二叉排序树(BST):又称二叉查找树,其定义为:二叉排序树或者是空树,或者是满足以下性质的二叉树。
       (1) 若它的左子树非空,则左子树上所有记录的关键字均小于根记录的值。
       (2) 若它的右子树非空,则右子树上所有记录的关键字均大于根记录的值。
       (3) 左、右子树本身又各是一棵二叉排序树。

      1.二叉排序树的构造算法:

      注:判定一棵二叉树是二叉排序树可以采用中序遍历算法将树上的顶点输出,如果得到的中序 序列是有序的,则说明这棵二叉树是二叉排序树,否则不是二叉排序树。

  #include<stdio.h>
  #include<stdlib.h>
  #define MAX 100
  typedef struct tnode
  {
    int data;
    struct tnode *lchild, *rchild;
  }TNODE;

  void create();
  void insert(int m);   //插入二叉排序树的结点
  void inOrder(TNODE *ptr);  //中序遍历

  TNODE *root=NULL;

  void inOrder(TNODE *ptr)
  {
    if(ptr!=NULL)
    {
      inOrder(ptr->lchild);
      printf("%d ", ptr->data);
      inOrder(ptr->rchild);
    }
  }

  void create()
  {
    int n, i;
    int k[MAX];
    printf("Please input the node number:\n");
    scanf("%d", &n);
    for(i=0; i<n; i++)
      scanf("%d",&k[i]);
    for(i=0; i<n; i++)
      insert(k[i]);
  }

  void insert(int m)
  {
    TNODE *p1, *p2;
    if(root==NULL)
    {
      root=(TNODE *)malloc(sizeof(TNODE));
      root->data=m;
      root->lchild=root->rchild=NULL;
    }
    else
    {
      p1=root;
      while(m!=p1->data)
      {
        if((m<p1->data) && (p1->lchild!=NULL))
          p1=p1->lchild;
        else if((m>p1->data) && (p1->rchild!=NULL))
          p1=p1->rchild;
        else if((m<p1->data) && (p1->lchild==NULL))
        {
          p2=(TNODE *)malloc(sizeof(TNODE));
          p2->data=m;
          p2->lchild=p2->rchild=NULL;
          p1->lchild=p2;
          return;
        }
        else if((m>p1->data) && (p1->rchild==NULL))
        {
          p2=(TNODE *)malloc(sizeof(TNODE));
          p2->data=m;
          p2->lchild=p2->rchild=NULL;
          p1->rchild=p2;
          return;
        }
      }
    }
  }

  int main()
  {
    create();
    printf("\n");
    inOrder(root);
    printf("\n");
    return 0;
  }
      Ctrl+F5运行SortTree.cpp输出结果如下:

      二叉排序树(BST)构造与应用_第2张图片

      

      2.求出二叉排序树T中小于x的最大元素和大于x的最小元素

      在二叉排序树中,一个小于树中某个结点的最大元素,是在中序序列中这个结点的直接前驱;大于这个
结点的最小元素,是在中序序列中这个结点的直接后继。
      其程序如下:

 #include<stdio.h>
 #include<stdlib.h>
 #define MAX 100
 typedef struct tnode
 {
   int data;
   struct tnode *lchild, *rchild;
 }TNODE;

 int last=0;
 void create();
 void insert(int m);   //插入二叉排序树的结点
 void findMaxMin(int aim, TNODE *ptr);

 TNODE *root=NULL;

 void findMaxMin(int aim, TNODE *ptr)
 {
   if(ptr!=NULL)
   {
     findMaxMin(aim, ptr->lchild);
     if(last<aim && ptr->data>=aim)       //找到小于aim的最大元素
       printf("a=%d\n",last);
     if(last<=aim && ptr->data>aim)       //找到大于aim的最小元素
       printf("b=%d\n",ptr->data);
     last=ptr->data;
     findMaxMin(aim, ptr->rchild);
   }
 }

 void create()
 {
   int n, i;
   int k[MAX];
   printf("Please input the node number:\n");
   scanf("%d", &n);
   for(i=0; i<n; i++)
     scanf("%d",&k[i]);
   for(i=0; i<n; i++)
     insert(k[i]);
 }

 void insert(int m)
 {
   TNODE *p1, *p2;
   if(root==NULL)
   {
     root=(TNODE *)malloc(sizeof(TNODE));
     root->data=m;
     root->lchild=root->rchild=NULL;
   }
   else
   {
     p1=root;
     while(m!=p1->data)
     {
       if((m<p1->data) && (p1->lchild!=NULL))
         p1=p1->lchild;
       else if((m>p1->data) && (p1->rchild!=NULL))
         p1=p1->rchild;
       else if((m<p1->data) && (p1->lchild==NULL))
       {
         p2=(TNODE *)malloc(sizeof(TNODE));
         p2->data=m;
         p2->lchild=p2->rchild=NULL;
         p1->lchild=p2;
         return;
       }
       else if((m>p1->data) && (p1->rchild==NULL))
       {
         p2=(TNODE *)malloc(sizeof(TNODE));
         p2->data=m;
         p2->lchild=p2->rchild=NULL;
         p1->rchild=p2;
         return;
       }
     }
   }
 }

 int main()
 {
   int toBeFind;
   create();
   printf("\n");
   printf("Input the record to be finded! \n");
   scanf("%d", &toBeFind);
   findMaxMin(toBeFind, root);
   printf("\n");
   return 0;
 }
      
     Ctrl+F5运行SortTree1.cpp输出结果如下:

     


你可能感兴趣的:(数据结构,C++,c,算法,二叉排序树)