算法篇----树

1. 求二叉树中叶子节点的个数(12年,17年)

	int Leave(BiTree *BT){
		if(BT==null)   
			return 0;
		else {
			if(BT->lchild==null && BT->rchild==null)
				return 1;
			else
				return(Leave(BT->lchild)+Leave(BT->rchild));	
		}
	}

2. 从大到小输出二叉排序树中所有的值不小于x的关键字(19年)

	void OutPut(BSTnode *bt,KeyType k){
		if(bt==null)
			return ;
		if(bt->rchild!=null)
			OutPut(bt->rchild,k);
		if(bt->data>=k)
			printf("%d",bt->data);
		if(bt->lchild!=null)
			OutPut(bt->lchild,k);			
	}

3. 假设二叉树采用二叉链存储,编写一个非递归算法,输出先序序列中第k个节点的数据值(18年)

	void PreOrder(Btnode *bt,int k){
		Btnode *p;
		SqStack sq;
		InitStack(sq);
		p=bt;
		int i=1;
		while(!StackEmpty(sq) || p!=null){
			while(p!=null){
				if(i==k)
					printf("%d",p->data);
				Push(sq,p);
				p=p->lchild;
				i++;
			}
			if(!StackEmpty(sq)){
				Pop(sq,p);
				p=p->rchild;
			}
		}
	}

4. 二叉树按二叉链表形式存储,设计一个非递归算法求二叉树的高度

	int BtDepth(BiTree T){
		if(!T)
			return 0;
		int fornt=-1,rear=-1;
		int last=0,level=0;
		BiTree Q[maxsize];
		Q[++rear]=T;
		BiTree p;
		while(front<rear){
			p=Q[++front];
			if(p->lchild)
				Q[++rear]=p->lchild;
			if(p->rchild)
				Q[++rear]=p->rchild;
			if(front==last){
				level++;
				last=rear;
			}
		}
		return level;
	}

5. 构造哈夫曼树,并求编码(16年)

	#define MAXBIT      100
	#define MAXVALUE  10000
	#define MAXLEAF     30
	#define MAXNODE    MAXLEAF*2 -1
	typedef struct {
    		int bit[MAXBIT];
    		int start;
	}HCodeType;        // 编码结构体
	typedef struct {
    		int weight,parent,lchild;
    		int rchild,value;
	}HNodeType;        // 结点结构体

	void HuffmanTree (HNodeType HuffNode[MAXNODE], int n{ 
    /* m1、m2:构造哈夫曼树不同过程中两个最小权值结点的权值,x1、x2:两个最小权值结点在数组中的序号。*/
    		int i, j, m1, m2, x1, x2;
   // 初始化存放哈夫曼树数组 HuffNode[] 中的结点
    for (i=0; i<2*n-1; i++){
        HuffNode[i].weight = 0;//权值 
        HuffNode[i].parent =-1;
        HuffNode[i].lchild =-1;
        HuffNode[i].rchild =-1;
        HuffNode[i].value=i;
    } 
    // 输入 n 个叶子结点的权值
    for (i=0; i<n; i++)
    		scanf ("%d", &HuffNode[i].weight);
    // 循环构造 Huffman 树
    for (i=0; i<n-1; i++){
        m1=m2=MAXVALUE;     
        // m1、m2中存放两个无父结点且结点权值最小的两个结点
        x1=x2=0;
        // 找出所有结点中权值最小、无父结点的两个结点,合并
        for (j=0; j<n+i; j++){
            if (HuffNode[j].weight<m1 && HuffNode[j].parent==-1){
                m2=m1; 
              	  x2=x1; 
                m1=HuffNode[j].weight;
                x1=j;
            }
            else if (HuffNode[j].weight<m2 && HuffNode[j].parent==-1){
                m2=HuffNode[j].weight;
                x2=j;
            }
        } 
        // 设置找到的两个子结点 x1、x2 的父结点信息
        HuffNode[x1].parent  = n+i;
        HuffNode[x2].parent  = n+i;
        HuffNode[n+i].weight = HuffNode[x1].weight + HuffNode[x2].weight;
        HuffNode[n+i].lchild = x1;
        HuffNode[n+i].rchild = x2;
 }
	//解码
	void decodeing(char string[],HNodeType Buf[],int Num){
  		int i,tmp=0,code[1024];
  		int m=2*Num-1;
  		char *nump;
 		char num[1024];
 		for(i=0;i<strlen(string);i++){
  			if(string[i]=='0')
  				num[i]=0;        
  			else
  				num[i]=1;                    
 		 } 
  		i=0;
 	 	nump=&num[0];
  		while(nump<(&num[strlen(string)])) {
  			tmp=m-1;
  			while((Buf[tmp].lchild!=-1)&&(Buf[tmp].rchild!=-1)){
		if(*nump==0){
    			tmp=Buf[tmp].lchild ;          
   		} 
   		else 
   			tmp=Buf[tmp].rchild;
  			nump++;
        
 		} 
 	printf("%d",Buf[tmp].value);                                  
	}
}

参考文章:https://blog.csdn.net/u012675150/article/details/43152483

6. 删除二叉排序树中存在关键字等于k的数据元素(19年)

	typedef struct BTNode{
		ElemType data;
		struct BTNode *lchild,*rchild;
	}BTNode,*BTree;
	status DeleteBST(BTree &T,KeyType key){
		if(!T) return false;
		else {
			if(EQ(key,T->data.key)) 
				return Delete(T);
			else if(LT(key,T->data.key))
				return DeleteBST(T->lchild,key);
			else 
				return DeleteBST(T->rchild,key);
		}
	}
	
	Status Delete(BTree &p){
		BTree q,s;
		if(!p->rchild){
			q=p;p=p->lchild;free(q);} //右子树空则只需重接左子树
		else if(!p->lchild){
			q=p;p=p->rchild;free(q);}
		else {
			q=p;s=p->lchild;
			while(s->rchild){
				q=p;s=p->rchild;} //转左,向右走到尽头
			p->data=s->data;
			if(q!=p){
				q->rchild=s->lchild;}
			else{
				q->lchild=s->lchild;}
			free(s);
		}
		return true;	
	}

7. 中序遍历线索二叉树T(16年)

	Typedef enum PointerTag{Tag,thread};
	typedef struct BTnode{
		elemtype data;
		struct BTnode *lchild,*rchild;
		PointerTag LTag,RTag;
	}BTnode,*BTree;
	status InOder(BTree T,status(*visit)(elemtype e)){
		BTnode *p;
		p=T->lchild;
		while(p!=T){
			while(p->LTag==link)
				p=p->lchild;
			if(!visit(p->data))  
				return error;
			while(p->RTag==Thread && p->rrchild!=T){
				p=p->rchild;
				visit(p->data);
			}
			p=p->rchild;
		}
		return ok;
	}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
9.25实现下列函数: int Search(SSTable s, KeyType k); /* Index the element which key is k */ /* in StaticSearchTable s. */ /* Return 0 if x is not found. */ 静态查找表的类型SSTable定义如下: typedef struct { KeyType key; ... ... // 其他数据域 } ElemType; typedef struct { ElemType *elem; int length; } SSTable; int Search(SSTable a, KeyType k) /* Index the element which key is k */ /* in StaticSearchTable s. */ /* Return 0 if x is not found. */ { int i; if(a.length==0) return ERROR; //先判断a是否为空 a.elem[a.length+1].key=k; for(i=1;a.elem[i].key>k;i++) if(i>=a.length||a.elem[i].key<k) //不能忽略i=a.length这种情况 return ERROR; return i; } /* { int i; a.elem[a.length+1].key=k; for(i=1;a.elem[i].key>k;i++) if(i>a.length||a.elem[i].key<k) return ERROR; return i; } */ 9.26② 试将折半查找算法改写成递归算法。 实现下列函数: int BinSearch(SSTable s, int low, int high, KeyType k); /* Index the element which key is k */ /* in StaticSearchTable s. */ /* Return 0 if x is not found. */ 静态查找表的类型SSTable定义如下: typedef struct { KeyType key; ... ... // 其他数据域 } ElemType; typedef struct { ElemType *elem; int length; } SSTable; int BinSearch(SSTable s, int low, int high, KeyType k) /* Index the element which key is k */ /* in StaticSearchTable s. */ /* Return 0 if x is not found. */ { int mid; if(low<=high) { mid=(low+high)/2; if(s.elem[mid].key==k) return mid; if(s.elem[mid].key<k) return BinSearch(s,mid+1,high,k); if(s.elem[mid].key>k) return BinSearch(s,low,high-1,k); } return 0; } /* { int mid; if(low<=high) { mid=(low+high)/2; if(s.elem[mid].key<k) return BinSearch(s,mid+1,high,k); else return BinSearch(s,low,high-1,k); } return 0; } */ 9.31④ 试写一个判别给定二叉是否为二叉排序算法,设此二叉以二叉链表作存储结构。且中结点的关键字均不同。 实现下列函数: Status IsBSTree(BiTree t); /* 判别给定二叉t是否为二叉排序。*/ /* 若是,则返回TRUE,否则FALSE */ 二叉的类型BiTree定义如下: typedef struct { KeyType key; ... ... // 其他数据域 } ElemType; typedef struct BiTNode { ElemType data; BiTNode *lchild,*rchild; }BiTNode, *BiTree; KeyType predt=-32767; Status IsBSTree(BiTree t) /* 判别给定二叉t是否为二叉排序。*/ /* 若是,则返回TRUE,否则FALSE */ { if( t )//&& ! ( t->lchild || t->rchild ) )//空和叶子不用判断 { if( t->lchild && ( t->data.key < t->lchild->data.key ) )//左孩子不空,左孩子的key比本身的大 return FALSE; else if( t->rchild && ( t->data.key > t->rchild->data.key ) )//右孩子不空,右孩子的key比本身的大 return FALSE; else if( !IsBSTree( t->lchild ) )//判断左子 return FALSE; else if( !IsBSTree( t->rchild ) )//判断右子 return FALSE; } return TRUE; } /* { if(!t) return OK; if(t&&!t->lchild&&!t->rchild) return OK; else { if(t->lchild->data.key<t->data.key) IsBSTree(t->lchild); if(t->lchild->data.key>=t->data.key) return ERROR; if(t->rchild->data.key>t->data.key) IsBSTree(t->rchild); else return ERROR; return OK; } } */ 9.33③ 编写递归算法,从大到小输出给定二叉排序中所有关键字不小于x的数据元素。要求你的算法的时间复杂度为O(log2n+m),其中n为排序中所含结点数,m为输出的关键字个数。 实现下列函数: void OrderOut(BiTree t, KeyType x, void(*visit)(TElemType)); /* Output is to use visit(t->data); */ 二叉的类型BiTree定义如下: typedef struct { KeyType key; ... ... // 其他数据域 } ElemType; typedef struct BiTNode { ElemType data; BiTNode *lchild,*rchild; }BiTNode, *BiTree; void OrderOut(BiTree t, KeyType x, void(*visit)(TElemType)) /* Output is to use visit(t->data); */ { if(t->rchild) OrderOut(t->rchild,x,visit); if(t->data.key>=x) visit(t->data); if(t->lchild)OrderOut(t->lchild,x,visit); } /* { if(t->rchild) OrderOut(t->rchild,x); if(t->data<x) exit(); visit(x); if(t->lchild)OrderOut(t->lchild,x); } */ 9.44④ 已知某哈希表的装载因子小于1,哈希函数 H(key)为关键字(标识符)的第一个字母在字母表中的序号,处理冲突的方法为线性探测开放定址法。试编写一个按第一个字母的顺序输出哈希表中所有关键字的算法。 实现下列函数: void PrintKeys(HashTable ht, void(*print)(StrKeyType)); /* 依题意用print输出关键字 */ 哈希表的类型HashTable定义如下: #define SUCCESS 1 #define UNSUCCESS 0 #define DUPLICATE -1 typedef char StrKeyType[4]; typedef struct { StrKeyType key; void *any; } HElemType; int hashsize[] = { 7,11,17,23,29,37,47 }; typedef struct { HElemType elem[MAXLEN]; int count; int sizeindex; } HashTable; int H(char *s)//求Hash函数 { if( s[0] ) return s[0]-'A'+1; //求关键字第一个字母的字母序号(小写) else return 0; } void PrintKeys(HashTable ht, void(*print)(StrKeyType)) /* 依题意用print输出关键字 */ { int i,j; for( i = 1; i <= 26; i++ ) { for( j = (i-1)%hashsize[ht.sizeindex]; ht.elem[j].key[0]; ) { if( H ( ht.elem[j].key ) == i ) print(ht.elem[j].key); j = (j+1)%hashsize[ht.sizeindex]; } } } /* void PrintKeys(HashTable ht, void(*print)(StrKeyType)) /* 依题意用print输出关键字 { int i,j; for(i=1;i<=26;i++) for(j=i;ht.elem[j].key;j=(j+1)%MAXLEN) if(H(ht.elem[j].key)==i) print(ht); } int H(char *s) { if(s) return s[0]-96; else return 0; } */ 9.45③ 假设哈希表长为m,哈希函数为H(x),用链地址法处理冲突。试编写输入一组关键字并建造哈希表的算法。 实现下列函数: int BuildHashTab(ChainHashTab &H, int n, HKeyType es[]) /* 直接调用下列函数 */ /* 哈希函数: */ /* int Hash(ChainHashTab H, HKeyType k); */ /* 冲突处理函数: */ /* int Collision(ChainHashTab H, HLink &p); */ { int i = 0,l,flag; HLink p,node; while( es[i] ) { l = Hash( H, es[i] ); node = ( HLink )malloc( sizeof( HNode ) ); node->data = es[i]; node->next = NULL; i++; if( !H.elem[l] ) H.elem[l] = node; else { flag = 0; p = H.elem[l]; if( p->data == node->data ) flag = 1; while( Collision( H, p ) ) if( p->data == node->data ) { flag = 1; break; } if( !flag ) { p = H.elem[l]; node->next = p; H.elem[l] = node; } } } } "+userLink+""; $('miniAd').show(); } }, onFailure: function(){} }}); } showMiniAd();

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值