• VC++2012编程演练数据结构《12》二叉排序树


    二叉排序树(Binary Sort Tree)又称二叉查找树。 

    它或者是一棵空树;或者是具有下列性质的二叉树: 

    (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

     (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

     (3)左、右子树也分别为二叉排序树;

       每个结点的C(i)为该结点的层次数。最坏情况下,当先后插入的关键字有序时,构成的二叉排序树蜕变为单支树,树的深度为,其平均查找长度为(n+1)/2(和顺序查找相同),最好的情况是二叉排序树的形态和折半查找的判定树相同,其平均查找长度和log 2 (n)成正比。


    类实现如下

    #include "stdafx.h"
    
    
    #include <iostream>
    #include <iomanip>
    #include<stdlib.h>
    
    using namespace std;
    //二叉树的链式存储结构表示
    typedef struct BinaryTree
    { int data;
      struct BinaryTree *l;
      struct BinaryTree *r;
    }*BiTree,BiNode;
    //二叉树的类定义
    class BiSearchT
    {private:
      BiTree root;
     public:
      //构造函数
      BiSearchT():root(NULL) {}
      //构造二叉链表表示的二叉树T
      int CreateSubTree(BiTree &t,int *all,int i);
      //先序遍历二叉树T
      int PreOrderTraverse(BiTree t,int (*Visit)(int e));
      //中序遍历二叉树T
      int InOrderTraverse(BiTree t,int (*Visit)(int e));
      //插入算法
      int InsertBST(BiTree *t,int e);
      //在二叉排序树中删除一个节点
      void Delete(BiTree *p);
      //二叉排序树的删除
      bool DeleteBST(BiTree *t,int key);
      //二叉排序树上的查找递归算法
      bool SearchBST(BiTree t,int key,BiTree f,BiTree *p);
    };
    //二叉排序树的类实现
    //构造二叉链表表示的二叉树T
    int BiSearchT::CreateSubTree(BiTree &t,int *all,int i)
    {if((all[i]==0)||i>16)
      {t=NULL;
       return 1;}
     t=(BiNode *)malloc(sizeof(BiNode));
     if(t==NULL) return 0;
     t->data=all[i];
     CreateSubTree(t->l,all,2*i);
     CreateSubTree(t->r,all,2*i+1);
    }
    //先序遍历二叉树T
    int BiSearchT::PreOrderTraverse(BiTree t,int (*Visit)(int d))
    {
      if(t){
        if(Visit(t->data))
          if(PreOrderTraverse(t->l,Visit))
    	if(PreOrderTraverse(t->r,Visit)) return 1;
        return 0;
      } else  return 1;
    }
    //中序遍历二叉树T
    int BiSearchT::InOrderTraverse(BiTree t,int (*Visit)(int d))
    {
      if(t){
        if(InOrderTraverse(t->l,Visit))
          if(Visit(t->data))
            if(InOrderTraverse(t->r,Visit)) return 1;
        return 0;
      }else return 1;
    }
    //二叉排序树上的查找递归算法
    bool BiSearchT::SearchBST(BiTree t,int key,BiTree f,BiTree *p)
    {if(!t) {*p=f;return false;}//递归的终结条件
     else if(key==t->data){ *p=t;return true;}
     else if(key<t->data) SearchBST(t->l,key,t,p);
     else SearchBST(t->r,key,t,p);//继续在右子树中查找
    }
    //插入算法
    int BiSearchT::InsertBST(BiTree *t,int e){
      BiTree p;
      BiTree s;
      if(!SearchBST(*t,e,NULL,&p)){
        s=(BiTree)malloc(sizeof(BiNode));
        s->data=e;s->l=s->r=NULL;
        if(!p) *t=s;
        else if(e<p->data) p->l=s;
        else p->r=s;
        return true;
      }
      else return false;
    }
    //在二叉排序树中删除一个节点
    void BiSearchT::Delete(BiTree *p){
     BiTree q,s;
      if(!(*p)->r)//在右子树删除
       {q=(*p);
        (*p)=(*p)->l;
        free(q);}
      else if(!(*p)->l)//在左子树删除
       {q=(*p);
        (*p)=(*p)->r;
        free(q);}
      else
       {q=s=(*p)->l;
        while(s->r) s=s->r;
        s->r=(*p)->r;
        free(*p);
        (*p)=q;}
    }
    //二叉排序树的删除
    bool BiSearchT::DeleteBST(BiTree *t,int key)
    {if(*t!=NULL)
     {if (key==(*t)->data) Delete(t);
      else
       if(key<(*t)->data) DeleteBST(&((*t)->l),key);
      else DeleteBST(&((*t)->r),key);
      return true;}
     else return false;
    }
    //输出二叉排序树的数据域值
    int printelem(int d)
    {cout<<setw(4)<<d;
     return 1;
    }



    调用如下

    //二叉排序树类的测试
    void main()
    {cout<<"运行结果:\n";
     BiTree root;
     BiTree sroot=NULL;
     BiTree croot=NULL;
     int all[16]={0,1,2,3,0,0,4,5,0,0,0,0,6,0,0,0};
     int i,a[10]={45,23,12,3,33,27,56,90,120,62};
     int n=7,b[]={10,7,6,9,20,12,22};
     BiSearchT my;
     my.CreateSubTree(root,all,1);
     cout<<"先序遍历(root,all):\n";
     my.PreOrderTraverse(root,printelem);
     cout<<"\n中序遍历(root,all):\n";
     my.InOrderTraverse(root,printelem);
     for(i=0;i<10;i++)
       my.InsertBST(&sroot,a[i]);
     cout<<"\n中序遍历(sroot,a):\n";
     my.InOrderTraverse(sroot,printelem);
     for(i=0;i<3;i++)
      my.DeleteBST(&sroot,a[i]);
     cout<<"\nNow sroot has nodes:\n";
     my.InOrderTraverse(sroot,printelem);
     for(i=0;i<n;i++)
       my.InsertBST(&croot,b[i]);
     cout<<"\n中序遍历(croot,b):\n";
     my.InOrderTraverse(croot,printelem);
     my.InsertBST(&croot,8);
     cout<<"\n中序遍历(croot,b):\n";
     my.InOrderTraverse(croot,printelem);
     my.DeleteBST(&croot,7);
     cout<<"\n中序遍历(croot,b):\n";
     my.InOrderTraverse(croot,printelem);
     cin.get();
    }



    效果如下



    代码下载

    http://download.csdn.net/detail/yincheng01/4786038






  • 相关阅读:
    IOS开发-cell的动态高度
    IOS开发-视频,音频,录音简单总结
    cocoapods的安装及注意事项
    CUICatalog: Invalid asset name supplied: (null) _configureCellForDisplay:forIndexPath
    IOS开发—数据库的使用
    IOS开发-键盘通知自定义键盘
    IOS开发-手势简单使用及手势不响应处理办法
    IOS开发-UITextField代理常用的方法总结
    Linux Shell 编程学习笔记
    Java的进程内缓存框架:EhCache
  • 原文地址:https://www.cnblogs.com/new0801/p/6177655.html
Copyright © 2020-2023  润新知