1 /* 2 Name: 在二元树中找出和为某一值的所有路径(树) 3 Copyright: 4 Author: yifi 5 Date: 27/11/16 17:10 6 Description: 7 */ 8 9 #include <bits/stdc++.h> 10 11 using namespace std; 12 13 14 struct BinaryTreeNode 15 { 16 int m_nValue; 17 BinaryTreeNode * m_pLeft; 18 BinaryTreeNode * m_pRight; 19 }; 20 21 int count = 0; 22 23 24 void FindPath(BinaryTreeNode* pTreeNode, 25 int expectedSum,vector<int>& path,int& currentSum) 26 { 27 if (!pTreeNode) 28 { 29 return ; 30 } 31 currentSum += pTreeNode->m_nValue; 32 path.push_back(pTreeNode->m_nValue); 33 bool isLeaf = !(pTreeNode->m_pLeft) && !(pTreeNode->m_pRight); 34 35 36 if (currentSum == expectedSum && isLeaf) 37 { 38 vector<int>::iterator iter; 39 for (iter = path.begin();iter != path.end(); iter++) 40 { 41 cout << *iter << " "; 42 } 43 cout << endl; 44 } 45 46 if (pTreeNode->m_pLeft) 47 { 48 FindPath(pTreeNode->m_pLeft,expectedSum,path,currentSum); 49 } 50 if (pTreeNode->m_pRight) 51 { 52 FindPath(pTreeNode->m_pRight,expectedSum,path,currentSum); 53 } 54 currentSum -= pTreeNode->m_nValue; 55 path.pop_back(); 56 } 57 58 void addTree(BinaryTreeNode **T, int num) 59 { 60 if(*T == NULL) 61 { 62 *T = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode)); 63 (*T)->m_nValue = num; 64 (*T)->m_pLeft = NULL; 65 (*T)->m_pRight = NULL; 66 } 67 else if((*T)->m_nValue > num) 68 addTree(&((*T)->m_pLeft), num); 69 else if((*T)->m_nValue < num) 70 addTree(&((*T)->m_pRight), num); 71 else 72 cout << "重复加入同一结点" << endl; 73 } 74 75 int main() 76 { 77 BinaryTreeNode * T = NULL; 78 addTree(&T, 10); 79 addTree(&T, 12); 80 addTree(&T, 5); 81 addTree(&T, 7); 82 addTree(&T, 4); 83 84 vector<int> path; 85 int sum = 0; 86 FindPath(T, 22, path, sum); 87 88 return 0; 89 } 90
/* Name: 子数组的最大和(数组) Copyright: Author: yifi Date: 23/11/16 22:51 Description: */ #include <bits/stdc++.h> using namespace std; int main() { int sum = 0; int MaxSum = -10000000; int a[] = {1,-2,3,10,-4,7,2,-5}; int i = 0; for (i = 0;i<8;i++) { if (sum < 0) { sum = a[i]; } else { sum += a[i]; } if (sum > MaxSum) { MaxSum = sum; } } cout << MaxSum << endl; }
/* Name: 包含 min 函数的栈(栈) Copyright: Author: yifi Date: 23/11/16 22:16 Description: */ #include <stdio.h> #include <iostream> using namespace std; #define STACK_SIZE 20 typedef struct _STACK{ int data[STACK_SIZE]; int top; int min; }Stack; void Init(Stack* s); void Push(Stack* s,int val); int Pop(Stack* s); bool Full(Stack* s); bool Empty(Stack* s); int Min(Stack* s); Stack haha; int main() { Stack s; Init( &s ); Push( &s, 3); std::cout << Min( &s ) << std::endl; Push( &s, 4); std::cout << Min( &s ) << std::endl; Push( &s, 2); std::cout << Min( &s ) << std::endl; Push( &s, 1); std::cout << Min( &s ) << std::endl; Pop( &s ); std::cout << Min( &s ) << std::endl; Pop( &s ); std::cout << Min( &s ) << std::endl; Push( &s, 0); std::cout << Min( &s ) << std::endl; return 0; } void Init(Stack* s) { s->top = -1; s->min = -1; haha.top = -1; } void Push(Stack* s,int val) { if (Full(s)) { printf("Satck is Full "); return ; } if (s->min == -1 || val < s->min) { s->min = val; haha.data[++haha.top] = val; } s->data[++s->top] = val; } int Pop( Stack *s ) { int data; if( Empty(s) ) { printf( "stack is empty " ); return -1; } data = s->data[s->top--]; if( data == haha.data[haha.top] ) { s->min = haha.data[--haha.top]; } return data; } int Min( Stack *s ) { return s->min; } bool Empty( Stack *s ) { if( s->top == -1 ) { return true; } return false; } bool Full( Stack *s ) { if( s->top == STACK_SIZE-1 ) { return true; } return false; }
1 /* 2 Name: 二元查找树转变成排序的双向链表(树) 3 Copyright: 4 Author: yifi 5 Date: 23/11/16 17:06 6 Description: 7 */ 8 9 10 #include <iostream> 11 using namespace std; 12 13 typedef struct _BSTreeNode{ 14 int m_Value; 15 _BSTreeNode* pLeft; 16 _BSTreeNode* pRight; 17 }BSTreeNode,*pBSTreeNode; 18 19 void addBSTreeNode(BSTreeNode *&pCurrent,int value); 20 void inOrderBSTree(BSTreeNode* pBSTree); 21 void convertToDoubleList(BSTreeNode* pCurrent); 22 23 BSTreeNode *pHead=NULL;//指向循环队列头结点 24 BSTreeNode *pIndex=NULL;//指向前一个结点 25 int main() 26 { 27 BSTreeNode *pRoot=NULL; 28 addBSTreeNode(pRoot,10); 29 addBSTreeNode(pRoot,6); 30 addBSTreeNode(pRoot,14); 31 addBSTreeNode(pRoot,4); 32 addBSTreeNode(pRoot,8); 33 addBSTreeNode(pRoot,12); 34 addBSTreeNode(pRoot,16); 35 inOrderBSTree(pRoot); 36 return 0; 37 } 38 39 40 void addBSTreeNode(BSTreeNode *&pCurrent,int value) 41 { 42 if (pCurrent == NULL) 43 { 44 BSTreeNode* pTemp = new BSTreeNode(); 45 pTemp->m_Value = value; 46 pTemp->pLeft = NULL; 47 pTemp->pRight = NULL; 48 pCurrent = pTemp; 49 } 50 else if (pCurrent->m_Value < value) 51 { 52 addBSTreeNode(pCurrent->pRight,value); 53 } 54 else if (pCurrent->m_Value > value) 55 { 56 addBSTreeNode(pCurrent->pLeft,value); 57 } 58 else 59 { 60 cout << "Node Repeated" << endl; 61 } 62 } 63 64 void inOrderBSTree(BSTreeNode* pBSTree) 65 { 66 if (pBSTree == NULL) 67 { 68 return ; 69 } 70 if (pBSTree->pLeft != NULL) 71 { 72 inOrderBSTree(pBSTree->pLeft); 73 } 74 convertToDoubleList(pBSTree); 75 if (pBSTree->pRight != NULL) 76 { 77 inOrderBSTree(pBSTree->pRight); 78 } 79 80 } 81 void convertToDoubleList(BSTreeNode* pCurrent) 82 { 83 pCurrent->pLeft = pIndex; 84 if (pIndex == NULL) 85 { 86 pHead = pCurrent; 87 } 88 else 89 { 90 pIndex->pRight = pCurrent; 91 } 92 pIndex = pCurrent; 93 94 cout << pCurrent->m_Value << " "; 95 }