void findMaxLen(BinTree root, int *maxLen) { //遍历到叶子结点,返回 if(root == NULL) return; //如果左子树为空,那么该节点左边最长距离为0 if(root->pleft == NULL) root->leftMaxValue = 0; //如果右子树为空,那么该节点右边最长距离为0 if(root->pright == NULL) root->rightMaxValue = 0; //如果左子树不为空,递归寻找左子树最长距离 if(root->pleft != NULL) findMaxLen(root->pleft, maxLen); //如果右子树不为空,递归寻找右子树最长距离 if(root->pright != NULL) findMaxLen(root->pright, maxLen); //计算左子树中距离根节点的最长距离 if(root->pleft != NULL) { if(root->pleft->leftMaxValue > root->pleft->rightMaxValue) root->leftMaxValue = root->pleft->leftMaxValue + 1; else root->leftMaxValue = root->pleft->rightMaxValue + 1; } //计算右子树中距离根节点的最长距离 if(root->pright != NULL) { if(root->pright->leftMaxValue > root->pright->rightMaxValue) root->rightMaxValue = root->pright->leftMaxValue + 1; else root->rightMaxValue = root->pright->rightMaxValue + 1; } //更新最长距离 if(root->leftMaxValue + root->rightMaxValue > *maxLen) *maxLen = root->leftMaxValue + root->rightMaxValue; }
#include <iostream> #include <string> using namespace std; char str[12][12]; char *s("ABCD,AABCD,DOT,TDO,BCAD,ABCDA,TDO,BDCA,BCDAA,ZZZ,XB"); //分配一个256大小的int数组即可,某个字符在str1中出现,则将int数组对应元素值加1; //某个字符在str2中出现,则将int数组对应元素值减去1,最后,只需要看int数组是否全为0 int equal(char* str1,char* str2){ int len1=strlen(str1); int len2=strlen(str2); if(len1 != len2) return 0; int flags[256]; memset(flags,0,sizeof(flags)); int i; for(i=0;i<len1;++i){ ++flags[str1[i]]; --flags[str2[i]]; } for(i=0;i<256;++i){ if(flags[i]!=0) return 0; } return 1; } int main() { int i,j=0,n,k=0,len=strlen(s); for(i=0;i<len;i++) { if(s[i]!=',') str[k][j++]=s[i]; else { k++;j=0; } } for(i=0;i<10;i++) { n=0; for(j=i+1;j<11;j++) { if(equal(str[i],str[j])&&strcmp(str[i],"")!=0) { if(n==0){ cout<<str[i]<<" "<<str[j]<<" "<<endl; n++; } else { cout<<str[j]<<" "<<endl; } //str[j]="00000000000"; strcpy(str[j],""); } } } return 0; }
#include <stdlib.h>//此段代码来源于网络上友人的 #include <stdio.h> //将有序的X[s..u]和X[u+1..v]归并为有序的Z[s..v] void merge(int X[], int Z[], int s, int u, int v) { int i, j, q; i = s; j = u + 1; q = s; while( i <= u && j<= v ) { if( X[i] <= X[j] ) Z[q++] = X[i++]; else Z[q++] = X[j++]; } while( i <= u ) //将X中剩余元素X[i..u]复制到Z Z[q++] = X[i++]; while( j <= v ) //将X中剩余元素X[j..v]复制到Z Z[q++] = X[j++]; } /* X[0..n-1]表示参加排序的初始序列 * t为某一趟归并时子序列的长度 * 整型变量i指出当前归并的两个子序列中第1个子序列的第1个元素的位置 * Y[0..n-1]表示这一趟归并后的结果 */ void mergePass(int X[], int Y[], int n, int t) { int i = 0, j; while( n - i >= 2 * t ) //将相邻的两个长度为t的各自有序的子序列合并成一个长度为2t的子序列 { merge(X, Y, i, i + t - 1, i + 2 * t - 1); i = i + 2 * t; } if( n - i > t ) //若最后剩下的元素个数大于一个子序列的长度t时 merge(X, Y, i, i + t - 1, n - 1); else //n-i <= t时,相当于只是把X[i..n-1]序列中的数据赋值给Y[i..n-1] for( j = i ; j < n ; ++j ) Y[j] = X[j]; } void mergeSort(int X[], int n) { int t = 1; int *Y = (int *)malloc(sizeof(int) * n); while( t < n ) { mergePass(X, Y, n, t); t *= 2; mergePass(Y, X, n, t); t *= 2; } free(Y); } void print_array(int array[], int n) { int i; for( i = 0 ; i < n ; ++i ) printf("%d ", array[i]); printf("\n"); } int main() { int array[] = {65, 2, 6, 1, 90, 78, 105, 67, 35, 23, 3, 88, -22}; int size = sizeof(array) / sizeof(int); mergeSort(array, size); print_array(array, size); return 0; }