栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构之树操作

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构之树操作

     本文打出了大部分树的操作 和部分知识点   还有自己编写的哈夫曼树中的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; 
}	



		   
//      中序线索二叉树 
 
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; //---是动态数组存储一个哈夫曼树

    //建立哈夫曼树(最优二叉树)   
    
    
   void creatHfm(THafuman t,int n)    //   t是哈夫曼树      n是 有权值的个数(叶子节点)    需要合并n-1次   
   {
   	if(n<=1)
	   return ;
	    
    int m=2*n-1;
   	t=(THafuman) malloc(sizeof(Hafuman)*(1+m));	//从1开始使用
    for(int i=1;i 

                                          本篇文章主要是树的操作

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/832358.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号