diff --git a/README.md b/README.md index 6bd498a..ecf2998 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +### 01背包问题的递归版的精简版 + ~~~c #include #define max(x,y)((x)>(y)?(x):(y)) @@ -37,4 +39,123 @@ int main(){ printf("\n"); printf("总价值=%d",maxv); } -~~~ \ No newline at end of file +~~~ + +### 斐波那契数列递归 + +~~~c +#include +int fib(int n){ + if(n<=2){ + return n; + }else{ + return fib(n-1)+fib(n-2); + } +} +int main(){ + int n; + printf("请输入想打印的斐波拉契数列:\n"); + scanf("%d",&n); + printf("斐波那契数列:\n"); + for(int i = 0;i<=n;i++){ + printf("%d ",fib(i)); + } + return 0; +} +~~~ + +### 常规的求解众数和重数 + +~~~c +#include +typedef struct{ + int number; + int count; +} Mode; +Mode findMode(int arr[],int n){ + Mode mode = {arr[0],1}; + int count = 1; + int maxCount = 1; + for(int i=0;imaxCount){ + mode.number = arr[i-1]; + mode.count = count; + maxCount = count; + } + count = 1; + } + } + if(count>maxCount){ + mode.number = arr[n-1]; + mode.count = count; + } + return mode; +} +int main(){ + int arr[] = {1,2,2,2,3,3,5,6,6,6,6}; + int n = sizeof(arr)/sizeof(arr[0]); + printf("递增序列: "); + for (int i = 0; i < n; i++)//输出待求众数序列中的元素; + printf("%d ",arr[i]); + printf("\n"); + Mode result = findMode(arr,n); + printf("众数为:%d,重数为:%d",result.number,result.count); + return 0; +} +~~~ + +### 二叉树递归版 + +~~~c +#include +#include +#define max(a,b)((a)>(b)?(a):(b)) +typedef struct TreeNode{ + int val; + struct TreeNode *left; + struct TreeNode *right; +}TreeNode; +int maxPathHelper(TreeNode *root,int *maxSum){ + if(root==NULL){ + return 0; + } + int leftSum = maxPathHelper(root->left,maxSum); + int rightSum = maxPathHelper(root->right,maxSum); + int currSum = max(max(root->val,root->val+leftSum+rightSum), + max(root->val+leftSum,root->val+rightSum)); + *maxSum = max(*maxSum,currSum); + return max(root->val,max(root->val+rightSum,root->val+leftSum)); +} +int maxPathSum(TreeNode *root){ + if(root==NULL){ + return 0; + } + int maxSum = 0; + maxPathHelper(root,&maxSum); + return maxSum; +} +TreeNode* createTreeNode(int val){ + TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode)); + newNode->val=val; + newNode->left=NULL; + newNode->right=NULL; + return newNode; +} +int main(){ + TreeNode* root = createTreeNode(-10); + root->left=createTreeNode(9); + root->right=createTreeNode(20); + root->right->left=createTreeNode(15); + root->right->right=createTreeNode(7); + int maxSum = maxPathSum(root); + printf("最大的路径和为:%d",maxSum); + free(root->left); + free(root->right); + free(root); + return 0; +} +~~~ +