数据结构之树操作

简介: 树的操作

    本文打出了大部分树的操作 和部分知识点   还有自己编写的哈夫曼树中的select函数(看书上是直接调用便自己打出了自己理解的select函数,有错请在评论区指出)

后续会补充栈,队列,线性表操作总结。

//二叉树树的存储结构
typedef struct BeTnode{
  char data;
  struct BeTnode*left,*right;
}BeTnode,*BeTree;    
      //        建立先序二叉树   要正好返回 
    BeTree jianlierchashu (BeTree t)
    {
      char ch;
      scanf("%c",&ch);
      if(ch=='#')
      {
        return ;
      }
      if(ch!='#')
      {
        t=(BeTree) malloc (sizeof(BeTnode));
        t->data=ch;
        t->left=NULL;
        t->right=NULL;
        jianlierchashu(t->left);
        jianlierchashu(t->right);
        return t;
      } 
    }
     //     求二叉树叶子节点的个数
int yezijiediangeshu(BeTree t)
{
  if(t==NULL)
  {
    return 0;
  }
  if(t->left==NULL&&t->right==NULL)
  {
    return 1;
  }
  int n=0,m=0;
  n=yezijiediangeshu(t->left);
  m=yezijiediangeshu(t->right);
  return m+n ;
     }     
//          求二叉树节点个数
int  jiediangeshu(BeTree t) 
{
        if(t==NULL)
        {
          return 0;
    }
    int n=0,m=0;
  n=jiediangeshu(t->left);//0 1
  m=jiediangeshu(t->right);//0 
  return 1+n+m;//1
}
              //二叉树树的深度
int shendu(BeTree t)
{
  if(t==NULL)
  return 0;
  int n=0,m=0;
  n=shendu(t->left);    
  m=shendu(t->right);
  return n>m?n+1:m+1; 
} 
//      中序线索二叉树 
/*
       主要是添加两个标识域
ltage=    1-则左指针域前驱       0-则左指针域左孩子     
rtage=    1-则右指针域后驱       0-则右指针域右孩子 
              物理存储结构 
*/ 
typedef struct TNode{
  char data;
  struct TNode *left;
  struct TNode *right;
  int ltage;
  int rtage;
}TNode,*BTNode; 
    void xiansuoerchashu(BTNode t)
  {
    BTNode pro=NULL;
    if(t)
    {
    xiansuoerchashu(t->left);  //因为为中序所以  要从左开始  递归调用到最左   返回
    if(t->left==NULL)
    {
    t->ltage=1;//设置标记 
    t->left=pro;  //pro为前驱    全局变量    初始值为NULL 
    } 
       else
     t->ltage=0;
     if(pro->right==NULL)    //这里为什么是pro那?因为现在操作的是t   只有t和pro的地址   所以要填充pro的右指针域 
     {
      pro->rtage=1;
      pro->right=t;
      }
      else
      pro->rtage=0; 
      pro=p;       //因为当前节点的操作完成了   所以将其赋值    递归右子树 
      xiansuoerchashu(t->right);
    }
   } 
      //树的存储 -1   双亲表示法 
  typedef struct PTNode{
    char data;
    int parent;//  双亲位置域 
  }PTNode;      //节点
  //树结构
  # define MAXSIZE 100
  typedef struct {
    PTNode node[MAXSIZE];//创建数组   可以存放MAXSIZE个节点     
    int r,n; //根节点位置个数 
  }PTree;    
    //树的存储 -2  孩子表示法    
  //孩子节点结构的定义  
typedef struct CTNode{
  int child;  //    int 类型    为该孩子在数组中的下标 
  struct CTNode* nexthaizi;        // 双亲节点的下一个孩子 
}*childptr;    
    //双亲节点结构
  typedef struct     
     {
      char data;
      childptr firstchild;      //孩子链表的头指针 
     }CTBox;
  //树结构
  typedef struct {
      CTBox node[MAXSIZE];
      int r,n;     //根节点的位置和节点数 
  }CTree;
   //方便找孩子  不方便找双亲    则添加一个双亲节点 
  typedef struct     
     {
      char data;
      int   pro; 
      childptr firstchild;      //孩子链表的头指针 
     }CTBox;
     //带双亲的孩子链表 
     //树的存储 -3   二叉链表表示法    
     /*
     左指针域    ---第一个孩子结点
     右指针域    ---向右一个  兄弟结点 
     找双亲比较困难 
     */
     typedef struct CTNode{
      char data;
      struct CTNode * lefthaizi;
        struct CTNode *rightxdi; 
     }CTNode;
     //哈夫曼树
      // 结点结构     
  typedef struct Hafuman  //顺序存储  ---     1维结构数组 
  {
    //权值
    //双亲  左孩子右孩子下标
    int weight;
    int parent,left,right; 
   }Hafuman,*THafuman; //---是动态数组存储一个哈夫曼树
    //建立哈夫曼树(最优二叉树)   
    /*
  权值越大越靠近根
  所以找权值要从小到大  从下到上进行构造哈夫曼树 
  每个权值都是根    权值实际也是叶子节点 
  而且不唯一,因为没有限定左右子树,并且有权值重复时,可能树的高度都不唯一,唯一的只是带权路径长度之和最小。
          王卓老师的口诀 
   构造森林全是根   选用二小造新树
   删除二小添新人   重复2,3剩单根 
  */
   void creatHfm(THafuman t,int n)    //   t是哈夫曼树      n是 有权值的个数(叶子节点)    需要合并n-1次   
   {
    if(n<=1)
     return ;
/*
1.    建数组 for循环初始化  3个域均为0 
2.    选出无双亲 中权值最小的两个  组成新的二叉树
3.    组成后    权值最小的两个  消失(有双亲) 
*/      
    int m=2*n-1;
    t=(THafuman) malloc(sizeof(Hafuman)*(1+m)); //从1开始使用
    for(int i=1;i<m+1;i++)
  {
    t[i].left=0;
    t[i].parent=0;
    t[i].right=0;
  }   
  for(int i=1;i<n+1;i++)
  {
    scanf("%d",&t[i].weight);
  }    
    //-----------------------------------------------------------
  //因为要 选出无双亲 中权值最小的两个  组成新的二叉树   所以要自定义函数胡
 int s1,s2;
  for(i=n+1;i<m+1;i++)
  {
     select(t,&s1,&s2,i);  
        t[i].weight=s1+s2;
  t[i].right=s1;
  t[i].left=s2;        
  }   
  } 
  int cmp(int *x, int *y) {
    return *x - *y;
}
  void select(THafuman *t,int &s1,int &s2,int n)    //s1,s2是需要返回的值 
  {
    int m=sizeof(t)/sizeof(Hafuman);
    THafuman a[m];//指针数组 
    int j=0;
  for(int i=1;i<m;i++)
  {
  if(t[i].parent==0)
  {
   a[j]=t[i]; 
    j++;
  }
  }   int i=0;
    qsort(a,j,sizeof(Hafuman),cmp);
    for(i=0;i<m;i++)
    { int p=0;
         if(a[0]==t[i]||a[1]==t[i])
       {
                  p++;
            t[i].parent=n;
            if(p==1)
        *s1=i;  
            else
            *s2=i;
       }  
  }
      }      
//哈夫曼编码
//算概率大  则权大  则要靠近根
//左分支标记为0,右分支标记为1进行编码  
/*
从根到叶子进行编码 
*/

image.gif

                                         本篇文章主要是树的操作

相关文章
|
存储 NoSQL Ubuntu
在Ubuntu 16.04上安装和配置Redis的方法
在Ubuntu 16.04上安装和配置Redis的方法
329 0
|
存储 Linux
深入了解Linux设备管理:字符、块和网络设备文件
深入了解Linux设备管理:字符、块和网络设备文件
518 0
|
Java API Spring
Spring Boot + MDC 实现全链路调用日志跟踪,这才叫优雅。。(上)
Spring Boot + MDC 实现全链路调用日志跟踪,这才叫优雅。。(上)
1290 0
|
算法 Python
Scipy 中级教程——优化
Scipy 中级教程——优化【1月更文挑战第6篇】
437 1
|
存储 网络协议 网络架构
网络互联
网络互联
1484 1
|
消息中间件 Java 关系型数据库
金三银四,如何远程面试拿下大厂offer?(附大厂面经+面试宝典)
“找工作 3 个多月了,还没有遇到合适的,坐标杭州。”“坐标北京,2 年工作经验,裸辞 1 个月了,Java/Python 方向都在找,投的简历都石沉大海了。”“金三银四找的全是 996 的,双休只有外企和非互联网行业。”“去年冬天被裁员的,今年到现在还没找着像样的工作。”“投了半个多月简历,一个面试机会都没有,送达,已读。”
|
存储 弹性计算 编解码
阿里云五代、六代、七代、八代云服务器实例规格性能提升介绍
阿里云服务器有多种实例规格可选,这些实例规格主要以五代、六代、七代和最新第八代倚天云服务器为主,当下主售的是以七代和八代云服务器为主,那么我们在购买阿里云服务器时所看到的各种云服务器实例具体属于那一代云服务器呢?有的用户可能并不清楚哪些实例规格分别属于哪一代实例,下面小编为大家介绍下阿里云五代、六代、七代、八代云服务器实例规格分别有哪些以及每一代云服务器在性能方面具体有哪些提升,以供大家参考和了解。
阿里云五代、六代、七代、八代云服务器实例规格性能提升介绍
|
数据挖掘
2022年最新中国科学院期刊分区表变化 | 生物类、医学类
2022年最新中国科学院期刊分区表变化 | 生物类、医学类
587 0
|
缓存 JavaScript
nodejs安装和环境配置
nodejs安装和环境配置
670 0
|
缓存 移动开发 运维
mPaaS云平台运维系列之—移动发布产品介绍
实时发布服务(Mobile Delivery Service,MDS)是 mPaaS 平台的核心基础服务组件之一,提供版本升级包、热修复包、H5 离线包的管理和发布服务,同时支持开关配置、白名单、发布规则管理功能。在客户端集成实时发布服务功能后,用户可以在 mPaaS 插件中生成新的包,然后在实时发布控制台发布新包,客户端收到新包并进行升级。实时发布服务还支持通过白名单进行灰度发布,可以使用高级过滤规则,比如指定机型,来进行更精准的灰度发布。
1304 0
mPaaS云平台运维系列之—移动发布产品介绍