二叉树的实现

二叉树的实现

一.二叉排序树的结点类型

typedef int KeyType;
typedef struct node 
{       KeyType key;            	  
       InfoType data;          	  
        struct node *lchild,*rchild; 	  
}  BSTNode;

二.SearchBST(BSTNode *T,KeyType k)

伪代码

BSTNode *SearchBST(T,k)
{ 
      if (T为空 || T->key==k) 	            
            return T;                       //返回T,递归出口
      if (k<T->key)
        return SearchBST(T->lchild,k);   //在左子树中递归查找
      else
        return SearchBST(T->rchild,k);   //在右子树中递归查找
}

代码

BSTNode* SearchBST(BSTNode* T ,KeyType k)
{
    if (T == NULL || T->key == k)
        return T;
    if (k < T->key)
        return SearchBST(T->lchild,k);
    else
        return SearchBST(T->rchild,k);
}

三.InsertBST(BSTNode *&T,KeyType k)

伪代码

int InsertBST(T,k)	
{ 
     if (T为空)	 //原树为空, 新插入的记录为根结点
     {      创建一个新的key域为k的结点;
            return 1;
      }
      else if  (k==T->key) 	//存在相同关键字的结点,返回0
           return 0;
      else if (k<T->key) 
          return InsertBST(T->lchild,k); 	//插入到左子树中
      else  
          return InsertBST(p->rchild,k);  	//插入到右子树中
 }

代码

int InsertBST(BSTNode*& T,KeyType k)
{
    if (T == NULL)
    {
        T = new BSTNode;
        T->key = k;
        T->lchild = T->rchild = NULL;
        return 1;
    }
    else if (k == T->key)
        return 0;
    else if (k < T->key)
        return InsertBST(T->lchild,k);
    else
        return InsertBST(T->rchild,k);
}

四.CreatBST(KeyType A[],int n)

伪代码

BSTNode *CreatBST(A[],n) //返回树根指针
{      BSTNode *T;
       T为空树;
       int i=0;
       while (i<n) 
       {    InsertBST(T,A[i]);  //将A[i]插入二叉排序树T中
           i++;
       }
       return T;       	    //返回建立的二叉排序树的根指针
}

代码

BSTNode* CreatBST(KeyType A[],int n)
{
    BSTNode* T = NULL;
    int i = 0;
    while (i < n)
    {
        InsertBST(T,A[i]);
        i++;
    }
    return T;
}

二叉树的实现

五.DeleteBST(BSTNode *&T,KeyType k)

伪代码

int DeleteBST(T,k)  //在bt删除关键字为k的结点
{ 
        if (T为空) return 0;	//空树删除失败
        else 
        {      if (k<T->key) return DeleteBST(T->lchild,k);	
                       //递归在左子树中删除为k的结点
	           else if (k>T->key) return DeleteBST(T->rchild,k);
	                   //递归在右子树中删除为k的结点
               else  
               {       Delete(T);    //调用Delete(T)函数删除*T结点
	                   return 1;
              }
      }
}
void Delete(p)   	 //从二叉排序树中删除*p结点
{     BSTNode *q;
      if (p结点没有右子树)        	
      {    用其左孩子结点替换它
      }
      else if (p结点没有左子树)    	
      {    用其右孩子结点替换它
      }
      else Delete1(p,p->lchild);	
            //*p结点既没有左子树又没有右子树的情况
}
void Delete1(p,r)
  //当被删*p结点有左右子树时的删除过程
  {     BSTNode *q;
         if (r的右孩子不为空)
	   		Delete1(p,r->rchild);	//递归找*r的最右下结点
        else  		              //r指向最右下结点
        {   
        	用r结点替换p;
	   		删除r结点;
       }
  }

代码

int DeleteBST(BSTNode*& T,KeyType k)  
{
    if (T == NULL) return 0;	
    else
    {
        if (k < T->key) 
        	return DeleteBST(T->lchild,k);
        else if (k >T->key) 
        	return DeleteBST(T->rchild,k);
        else   
        {
            Delete(T);    
            return 1;
        }
    }
}
void Delete(BSTNode*& p)   	 
{
    BSTNode* q;
    if (p->rchild == NULL)        	
    {
        q = p; p = p->lchild;		
        free(q);
    }
    else if (p->lchild == NULL)    	
    {
        q = p; p = p->rchild;	
        free(q);
    }
    else Delete1(p,p->lchild);
}
void Delete1(BSTNode* p,BSTNode*& r)
{
    BSTNode* q;
    if (r->rchild != NULL)
        Delete1(p,r->rchild);	
    else  		              
    {
        p->key = r->key;  
        p->data = r->data;   
        q = r; r = r->lchild;          
        free(q); 	              
    }
}

二叉树的实现
二叉树的实现
二叉树的实现
二叉树的实现
二叉树的实现
二叉树的实现

六.

随机生成包含100000个节点的BST,节点的值为证书其范围为[-300000,300000],输出其树的高度。然后随机搜1000个数值,统计每次的ASL。

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
typedef int KeyType;
typedef int InfoType;
typedef struct node
{
    KeyType key;            	  //关键字项
    InfoType data;          	  //其他数据域
    struct node* lchild, * rchild; 	  //左右孩子指针
}  BSTNode;
BSTNode* SearchBST(BSTNode* T ,KeyType k,int &count)
{
    if (T == NULL || T->key == k)
    {
        if (T!= NULL)
            count++;
        return T;
    }
        
    if (k < T->key)
    {
        count++;
        return SearchBST(T->lchild, k,count);
    }
    else
    {
        count++;
        return SearchBST(T->rchild, k,count);
    }
 }
        
int InsertBST(BSTNode*& T,KeyType k)
{
    if (T == NULL)
    {
        T = new BSTNode;
        T->key = k;
        T->lchild = T->rchild = NULL;
        return 1;
    }
    else if (k == T->key)
        return 0;
    else if (k < T->key)
        return InsertBST(T->lchild,k);
    else
        return InsertBST(T->rchild,k);
}
BSTNode* CreatBST(int n)
{
    BSTNode* T = NULL;
    int i = 0;
    int x;
    srand((unsigned int)time(NULL));
    while (i < n)
    {
        x = rand() * 10 % 300000 - 150000;
        InsertBST(T,x);
        i++;
    }
    return T;
}
void DestroyBST(BSTNode* bt)//销毁树
{
    if (bt != NULL)
    {
        DestroyBST(bt->lchild);
        DestroyBST(bt->rchild);
        delete bt;
    }
}
void InOrder(BSTNode* b)
{
    if (b != NULL)
    {
        InOrder(b->lchild);
        printf("%d ", b->key); 	//访问根结点
        InOrder(b->rchild);
    }
}
int GetHeight(BSTNode* BT)
{
    int lchilddep, rchilddep;
    if (BT == NULL) return(0); 	//空树的高度为0
    else
    {
        lchilddep = GetHeight(BT->lchild);
        //求左子树的高度为lchilddep
        rchilddep = GetHeight(BT->rchild);
        //求右子树的高度为rchilddep
        return(lchilddep > rchilddep) ? (lchilddep + 1) : (rchilddep + 1);
    }
}
int main()
{
    BSTNode* T;
    int n;
    int i;
    int count,sum=0;
    int height;
    cin >> n;
    srand((unsigned int)time(NULL));
    T=CreatBST( n);
    height=GetHeight(T);
    cout << "树的高度"<<height << endl;
    int a[1000];
    for (i = 0; i < 1000; i++)
    {
        a[i] = rand() * 10 % 300000 - 150000;
    }
    for (i = 0; i < 1000; i++)
    {
        count = 0;
        SearchBST(T, a[i], count);
        sum = sum + count;
    }
    cout << "ASL:";
    cout << sum / 1000;
    DestroyBST(T);
    return 0;
}

二叉树的实现
二叉树的实现
二叉树的实现
二叉树的实现

我通过许多次测试,树的平均高度为36,ASL的平均值为18。

七.总结

1.通过伪代码我们可以先理清思路,再写代码就不会卡住,运行错误,也可以更快的找出错误所在。

2.二叉排序树的操作函数中,删除结点函数较难,需要考虑多种情况,编写难度较大。

3.学习了如何随机产生一个随机数,并且产生在一定范围里。

4.二叉排序树的时间复杂度为O(log2(n)),查找成功的平均查找长度为[(n+1)/n]*log2(n+1)-1,最小高度为log2(n)+1。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114450.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Hadoop集群配置(最全面总结)

    Hadoop集群配置(最全面总结)Hadoop 集群配置 最全面总结 nbsp nbsp huangguisu nbsp nbsp nbsp nbsp nbsp nbsp 通常 集群里的一台机器被指定为 nbsp NameNode 另一台不同的机器被指定为 JobTracker 这些机器是 masters 余下的机器即作为 DataNode 也作为 TaskTracker 这些机器是 slaves 官方地址 http hadoop apache org common docs r0 19 2 cn cl

    2025年8月1日
    5
  • Git使用之(pathspec master did not match any file(s) known to git)「建议收藏」

    Git使用之(pathspec master did not match any file(s) known to git)

    2022年2月20日
    42
  • Jacob 调用金税系统

    Jacob 调用金税系统1.调用打印方法时,若是有预览弹窗提示,程序会阻塞住,并在控制台打印一行:C:\ProgramFiles(x86)\��Ʊ���\914601007603699430.0\Config\Print\PrinterManager.xml(乱码部分是金税盘中文路径名)经检测,此文件是打印机选择文件,已安装过的的打印机,此文件编码未知,用编辑器试了好几种编码格式打开打开都是一堆乱码。若是…

    2022年6月11日
    36
  • Java Serialized 序列化 作用

    今天在看设计模式时,看到迪米特法则时,有一点,谨慎使用Serialized:一个项目中使用远程方法调用方式传递一个VO(值对象),这个对象就必须实现Serialized接口,也就是把需要网络传输的对象进行序列化,否则会出现NotSerialiableException异常。若VO修改了一个属性的权限,由private改为public访问权限变大了,如果服务器上没有做出相应的变更,就会报…

    2022年4月4日
    71
  • 结构体数组初始化

    结构体数组初始化《代码大全》建议在变量定义的时候进行初始化,但是很多人,特别是新人对结构体或者结构体数组定义是一般不会初始化,或者不知道怎么初始化。1、初始化typedefstruct_TEST_T{       inti;       charc[10];}TEST_T;TEST_T gst  ={1,“12345”};//可以初始化,设置i为1

    2022年7月18日
    16
  • C语言dfs深度优先遍历_图的深度优先遍历举例

    C语言dfs深度优先遍历_图的深度优先遍历举例转载:https://blog.csdn.net/rr123rrr/article/details/77971771图的搜索有两种方式,一种是深度优先搜索(Depth-First-Search),另一种是广度优先搜索(Breadth-First-Search),接下来,我们来写一下这些搜索方式的Java实现,同样的,这里的代码均继承了自定义的EnhanceModual类,我之前的文章(查看En…

    2022年4月19日
    66

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号