• Chap4: question: 19


    19. 二叉树的镜像(递归)

     即:交换所有节点的左右子树。从下往上 或 从上往下 都可以。

    #include <iostream>
    #include <string>
    using namespace std;
    struct BTNode
    {
    	int v;  // default positive Integer.
    	BTNode *pLeft;
    	BTNode *pRight;
    	BTNode(int x) : v(x), pLeft(NULL), pRight(NULL) {}
    };
    /********************************************************/
    /*****        Basic functions          ***********/
    BTNode* createBinaryTree(int r)
    {
    	BTNode *pRoot = new BTNode(r);
    	int u, v;
    	cin >> u >> v;
    	if(u != 0)
    		pRoot->pLeft = createBinaryTree(u);
    	if(v != 0)
    		pRoot->pRight = createBinaryTree(v);
    	return pRoot;
    }
    void release(BTNode *root){
    	if(root == NULL) return;
    	release(root->pLeft);
    	release(root->pRight);
    	delete[] root;
    	root = NULL;
    }
    void print(BTNode *root, int level = 1){
    	if(root == NULL) { cout << "NULL"; return; };
    	string s;
    	for(int i = 0; i < level; ++i) s += "   ";
    	cout << root->v << endl << s;
    	print(root->pLeft, level+1);
    	cout << endl << s;
    	print(root->pRight, level+1);
    }
    /******************************************************************/
    void mirrorTree(BTNode *root)
    {
    	if(!root || (!root->pLeft && !root->pRight)) return;
    	/*    交换左右子树           */
    	BTNode *pTem = root->pLeft; 
    	root->pLeft = root->pRight;
    	root->pRight = pTem;
    
    	mirrorTree(root->pLeft);
    	mirrorTree(root->pRight);
    }
    
    
    int main(){
    	int TestTime = 3, k = 1;
    	while(k <= TestTime)
    	{
    		cout << "Test " << k++ << ":" << endl;
    		
    		cout << "Create a tree: " << endl;
    		BTNode *pRoot = createBinaryTree(8);
    		print(pRoot);
    		cout << endl;
    
    		cout << "The mirror tree: " << endl;
    		mirrorTree(pRoot);
    		print(pRoot);
    		cout << endl;
    
    		release(pRoot);
    	}
    	return 0;
    }
    

     

     20. 顺时针打印矩阵

     1 #include <stdio.h>
     2 
     3 void printMatrix(int (*A)[1], int rows, int columns)
     4 {
     5     if(rows < 1 || columns < 1) return;
     6     int r1, r2, c1, c2;
     7     r1 = c1 = 0, r2 = rows-1, c2 = columns-1;
     8     while(r1 <= r2 && c1 <= c2) /* 打印结束时, r1 = r2+1, c1 = c2+1; */
     9     {
    10         for(int i = c1; i <= c2 && r1 <= r2; ++i)
    11             printf("%d ", A[r1][i]);
    12         ++r1;
    13         for(int i = r1; c1 <= c2 && i <= r2; ++i)
    14             printf("%d ", A[i][c2]);      /*   要保证 c1 <= c2  */      
    15         --c2;
    16         for(int i = c2; i >= c1 && r1 <= r2; --i)
    17             printf("%d ", A[r2][i]);
    18         --r2;
    19         for(int i = r2; i >= r1 && c1 <= c2; --i)
    20             printf("%d ", A[i][c1]);
    21         ++c1;
    22     }
    23     printf("
    ");
    24 }
    25 int main()
    26 {
    27     int test1[3][3] = {{1, 2, 3},
    28                        {4, 5, 6}, 
    29                         {7, 8, 9}};
    30     printMatrix(test1, 3, 3);
    31 
    32     int test2[1][3] = {1, 2, 3};
    33     printMatrix(test2, 1, 3);
    34 
    35 /*  // first set int (*A)[1], then began called below. 
    36     int test3[3][1] = {{1}, {2}, {3}};
    37     printMatrix(test3, 3, 1);
    38 
    39     int test4[1][1] = {1};
    40     printMatrix(test4, 1, 1);
    41 */
    42     return 0;
    43 }
    View Code

          (

     21. 包含 min  函数的栈

     要求调用 min,pop,push,时间复杂度都是 O(1)。

     1 #include <iostream>
     2 #include <stack>
     3 #include <cassert>
     4 #include <string>
     5 template<typename T> class Stack
     6 {
     7 public:
     8     void push(T value);
     9     void pop();
    10     T min();
    11 private:
    12     std::stack<T> data;
    13     std::stack<T> minData;
    14 };
    15 template<typename T> void Stack<T>::push(T value)
    16 {
    17     data.push(value);
    18     if(minData.empty() || minData.top() >= value)
    19         minData.push(value);
    20     else
    21         minData.push(minData.top());
    22 }
    23 template<typename T> void Stack<T>::pop()
    24 {
    25     assert(data.size() > 0 && minData.size() > 0);
    26     data.pop();
    27     minData.pop();
    28 }
    29 template<typename T> T Stack<T>::min()
    30 {
    31     return minData.top();
    32 }
    33 
    34 int main()
    35 {
    36     Stack<char> st;
    37     std::string numbers;
    38     while(std::cin >> numbers)
    39     {
    40         for(size_t i = 0; i < numbers.length(); ++i) st.push(numbers[i]);
    41         for(size_t i = 0; i < numbers.length(); ++i)
    42         {
    43             std::cout << "st.min(): " << st.min() << std::endl;
    44             st.pop();
    45         }
    46     }
    47     return 0;
    48 }
    View Code

    22. 根据栈的压入序列,判断一个序列是否是弹出序列。 

    #include <iostream>
    #include <string>
    
    bool isPopOrder(const std::string pushS, const std::string popS)
    {
    	size_t outId1 = 0, outId2 = 0, len1 = pushS.length(), len2 = popS.length();
    	if(len1 != len2) return false;
    	int *stack = new int[len1];
    	int tail = 0; // 栈尾 
    	while(outId1 < len1 && outId2 < len2)
    	{
    		while(pushS[outId1] != popS[outId2])
    		{
    			stack[tail++] = pushS[outId1++]; // 入栈
    		}
    		outId1++, outId2++;
    		while(tail != 0 && popS[outId2] == stack[tail-1])
    		{
    			++outId2;
    			tail--;     // 出栈
    		}
    	}
    	delete[] stack;
    	if(tail == 0) return true; // 栈空
    	else return false;
    }
    
    int main()
    {
    	std::string numbers;
    	std::string popNumbers;
    	while(std::cin >> numbers >> popNumbers)
    	{
    		std::cout << "一个弹出序列?   " ;
    
    		if(isPopOrder(numbers, popNumbers))
    			std::cout << "true" << std::endl;
    		else std::cout << "false" << std::endl;
    	}
    	return 0;
    }
    

     

    23. 从上往下打印二叉树

     Go:(Chap2: question: 1 - 10—>6. 重建二叉树—>二叉树的各种遍历)Link: http://www.cnblogs.com/liyangguang1988/p/3667443.html

    24. 判断序列是否为二叉搜索树的后序遍历(递归)

    note: 二叉搜索树和遍历序列一一对应。

    例:后序序列 {3,5,4,6,11,13,12, 10, 8} ,可画出一颗二叉搜索树。

     1 #include <iostream> 
     2 /* verify the seq which should be the postOrder of a Binary Search Tree  */
     3 bool postOrderOfBST(int sequence[], int len)
     4 {
     5     if(sequence == NULL || len == 0) return false;
     6     bool answer = false;
     7     int root = sequence[len-1];    /* value of root node */
     8 
     9     int leftLength = 0;
    10     for(; leftLength < len-1; ++leftLength)
    11     {
    12         if(sequence[leftLength] > root) break;
    13     }
    14     /*  verify right-subtree, should big than root  */
    15     for(int i = leftLength + 1; i < len -1; ++i)
    16     {
    17         if(sequence[i] < root) return false;
    18     }
    19 
    20     int rightLength = len - 1 - leftLength;
    21     bool left = true, right = true;
    22     if(leftLength > 0)
    23         bool left = postOrderOfBST(sequence, leftLength);
    24     if(rightLength)
    25         bool right = postOrderOfBST(sequence+leftLength, rightLength);
    26     return (left && right);
    27 }
    28 
    29 void printResult(bool v)
    30 {
    31     std::cout << "Is LRD of a BFS?  " ; 
    32     if(v)  std::cout << "true" << std::endl;
    33     else  std::cout << "false" << std::endl; 
    34 }
    35 int main() 
    36 {
    37     std::cout << "Test 1: ";
    38     int test1[] = {3, 5, 4, 6, 11, 13, 12, 10, 8};
    39     printResult(postOrderOfBST(test1, sizeof(test1) / 4)) ;
    40 
    41     std::cout << "Test 2: ";
    42     int test2[] = {4, 2, 3}; 
    43     printResult(postOrderOfBST(test2, sizeof(test2) / 4)); 
    44         
    45     std::cout << "Test 3: ";
    46     int test3[] = {1};
    47     printResult(postOrderOfBST(test3, sizeof(test3) / 4));
    48 
    49     return 0; 
    50 } 
    View Code

      

     25. 二叉树中和为某一值的路径(递归)

     1 #include <iostream> 
     2 #include <string>
     3 #include <vector>
     4 using namespace std; 
     5 struct BTNode 
     6 { 
     7     int v;  // default positive Integer. 
     8     BTNode *pLeft; 
     9     BTNode *pRight; 
    10     BTNode(int x) : v(x), pLeft(NULL), pRight(NULL) {} 
    11 }; 
    12 /********************************************************/
    13 /*****        Basic functions          ***********/
    14 BTNode* createBinaryTree(int r) 
    15 { 
    16     BTNode *pRoot = new BTNode(r); 
    17     int u, v; 
    18     cin >> u >> v; 
    19     if(u != 0) 
    20         pRoot->pLeft = createBinaryTree(u); 
    21     if(v != 0) 
    22         pRoot->pRight = createBinaryTree(v); 
    23     return pRoot; 
    24 } 
    25 void release(BTNode *root){ 
    26     if(root == NULL) return; 
    27     release(root->pLeft); 
    28     release(root->pRight); 
    29     delete[] root; 
    30     root = NULL; 
    31 } 
    32 void print(BTNode *root, int level = 1){ 
    33     if(root == NULL) { cout << "NULL"; return; }; 
    34     string s; 
    35     for(int i = 0; i < level; ++i) s += "	"; 
    36     cout << root->v << endl << s; 
    37     print(root->pLeft, level+1); 
    38     cout << endl << s; 
    39     print(root->pRight, level+1); 
    40 } 
    41 /******************************************************************/
    42 void findPath(BTNode *root, int target, vector<int>& path, int curSum)
    43 {
    44     if(root == NULL) return;
    45     curSum += root->v;
    46     path.push_back(root->v);
    47     if(!root->pLeft && !root->pRight && (curSum == target))  // root node is a leaf, get a path.
    48     {
    49         for(auto it = path.begin(); it != path.end(); ++it)
    50             cout << *it << " ";
    51         cout << endl;
    52     }
    53     findPath(root->pLeft, target, path, curSum);
    54     findPath(root->pRight, target, path, curSum);
    55     path.pop_back();
    56 }
    57 
    58 void findPath(BTNode *root, int target)
    59 {
    60     if(root == NULL) return;
    61     vector<int> path;
    62     findPath(root, target, path, 0);
    63 }
    64 
    65 int main(){ 
    66     int TestTime = 3, k = 1; 
    67     while(k <= TestTime) 
    68     { 
    69         int root;
    70         cout << "Test " << k++ << ":" << endl; 
    71 
    72         cout << "Create a tree: " << endl; 
    73         cin >> root;
    74         BTNode *pRoot = createBinaryTree(root); 
    75         print(pRoot); 
    76         cout << endl; 
    77 
    78         cout << "target :  22" << endl << "findPath :" << endl; 
    79         findPath(pRoot, 22);
    80 
    81         release(pRoot); 
    82     } 
    83     return 0; 
    84 } 
    Code

     26. 复杂链表的复制

      1 #include <stdio.h>
      2 typedef char Elem; 
      3 typedef struct ComplexListNode
      4 {
      5     Elem e;
      6     ComplexListNode *next;
      7     ComplexListNode *sibling;
      8 } ComplexList;
      9 ComplexListNode Node[26] = {0};
     10 /***************************************************************/
     11 ComplexList* creatComplexList()
     12 {
     13     for(int i = 0; i < 26; ++i)
     14         Node[i].e = i + 'A';
     15     char u, v;
     16     while((scanf("%c%c", &u, &v) == 2) )
     17     {
     18         if(u >= 'A' && u <= 'Z' && v >= 'A' && v <= 'Z')
     19         {
     20             if(Node[u-'A'].next == NULL)
     21                 Node[u-'A'].next = &Node[v-'A'];
     22             else if(Node[u-'A'].sibling == NULL)
     23                 Node[u-'A'].sibling = &Node[v-'A'];
     24         }
     25         if(getchar() == '
    ') break;
     26     }
     27     return &Node[0];
     28 }
     29 
     30 void printComplexList(ComplexList *pHead)
     31 {
     32     ComplexListNode *p = pHead;
     33     while(p != NULL)
     34     {
     35         printf("%c -> ", p->e);
     36         p = p->next;
     37     }
     38     printf("NULL
    ");
     39     p = pHead;
     40     while(p != NULL)
     41     {
     42         if(p->sibling != NULL)
     43         {
     44             printf("%c -> ", p->e);
     45             printf("%c	", p->sibling->e);
     46         }
     47         p = p->next;
     48     }
     49 }
     50 /***************************************************************************/
     51 void cloneNodes(ComplexList *pHead)
     52 {
     53     ComplexListNode *p = pHead;
     54     while(p != NULL)
     55     {
     56         ComplexListNode *newNode = new ComplexListNode;
     57         newNode->e = p->e + 32;
     58         newNode->next = p->next;
     59         newNode->sibling = NULL;
     60         p->next = newNode;
     61         p = newNode->next;
     62     }
     63 }
     64 
     65 void connectSibling(ComplexList *pHead)
     66 {
     67     ComplexListNode *pPre = pHead, *p;
     68     while(pPre != NULL && pPre->next != NULL)
     69     {
     70         p = pPre->next;
     71         if(pPre->sibling != NULL)
     72             p->sibling = pPre->sibling->next;
     73         pPre = p->next;
     74     }
     75 }
     76 
     77 ComplexList* getClonedComplexList(ComplexList *pHead)
     78 {
     79     ComplexListNode *pPre = pHead, *newHead = NULL, *p;
     80     while(pPre != NULL && pPre->next != NULL)
     81     {
     82         if(newHead != NULL) 
     83         {
     84             p->next = pPre->next;
     85             p = p->next;
     86         }
     87         else 
     88         {
     89             newHead = pPre->next;
     90             p = newHead;
     91         }
     92         pPre->next = pPre->next->next;
     93         pPre = pPre->next;
     94     }
     95     return newHead;
     96 }
     97 
     98 ComplexList* clone(ComplexList *pHead)
     99 {
    100     cloneNodes(pHead);
    101     connectSibling(pHead);
    102     return getClonedComplexList(pHead);
    103 }
    104 
    105 int main()
    106 {
    107     ComplexList *pHead = creatComplexList();
    108     printf("original List.
    ");
    109     printComplexList(pHead);
    110 
    111     ComplexList *newHead = clone(pHead);
    112     printf("cloned List.
    ");
    113     printComplexList(newHead);
    114 
    115     printf("original List.
    ");
    116     printComplexList(pHead);
    117 
    118     return 0;
    119 }
    View Code

    程序说明:对一个结点,若 next 和 sibling 同时为 0,先保存 next 指针。
    样例输入:AB AC BC BE CD DE DB(回车换行)

     

     27.二叉搜索树生成有序双向链表

      1 #include <iostream> 
      2 #include <string> 
      3 using namespace std; 
      4 typedef struct BTNode 
      5 { 
      6     int v;     // In this code, default positive Integer. 
      7     BTNode *pLeft; 
      8     BTNode *pRight; 
      9     BTNode(int x) : v(x), pLeft(NULL), pRight(NULL) {} 
     10 } DbList; 
     11 /********************************************************/
     12 /*****        Basic functions  for binary tree     ***********/
     13 BTNode* createBinaryTree() // input a preOrder sequence, 0 denote empty node.
     14 { 
     15     BTNode *pRoot = NULL;
     16     int r;
     17     cin >> r;
     18     if(r != 0)         // equal to if(!r) return;
     19     {
     20         pRoot = new BTNode(r);
     21         pRoot->pLeft = createBinaryTree();
     22         pRoot->pRight = createBinaryTree();
     23 
     24     }
     25     return pRoot;
     26 } 
     27 
     28 void printBinaryTree(BTNode *root, int level = 1){ 
     29     if(root == NULL) { cout << "NULL"; return; }; 
     30     string s; 
     31     for(int i = 0; i < level; ++i) s += "   "; 
     32     cout << root->v << endl << s; 
     33     printBinaryTree(root->pLeft, level+1); 
     34     cout << endl << s; 
     35     printBinaryTree(root->pRight, level+1); 
     36 } 
     37 
     38 // void releaseBinaryTree(BTNode *root){ 
     39 //     if(root == NULL) return; 
     40 //     releaseBinaryTree(root->pLeft); 
     41 //     releaseBinaryTree(root->pRight); 
     42 //     delete[] root; 
     43 //     root = NULL; 
     44 // } 
     45 /******************************************************************/
     46 /****************** basic function for double linked list. *******/
     47 void printDbList(DbList *pHead)
     48 {
     49     if(pHead == NULL) return;
     50     DbList *p = pHead;
     51     cout << "Print from left to right:" << endl;
     52     while(p->pRight != NULL) { cout << p->v << " "; p = p->pRight;}
     53     cout << p->v << endl;
     54 
     55     cout << "Print from left to right:" << endl;
     56     while(p != NULL) { printf("%-3d", p->v); p = p->pLeft;}
     57     cout << endl;
     58 }
     59 void releaseDbList(DbList *pHead)
     60 {
     61     if(pHead == NULL) return;
     62     releaseDbList(pHead->pRight);
     63     delete[] pHead;
     64 }
     65 /******************************************************************/
     66 /*****   binary search tree translate to double linked list    ******/
     67 void convert(BTNode *root, BTNode **tail)
     68 {
     69     if(root == NULL) return;
     70 
     71     if(root->pLeft != NULL)
     72         convert(root->pLeft, tail);
     73     root->pLeft = *tail;
     74     if(*tail) 
     75         (*tail)->pRight = root; 
     76     *tail = root; 
     77     
     78     if(root->pRight != NULL)
     79         convert(root->pRight, tail);
     80 };
     81 
     82 BTNode* treeToDList(BTNode *root)
     83 {
     84     if(root == NULL) return NULL;
     85     BTNode *tail = NULL;
     86     convert(root, &tail);
     87     BTNode *pHead = tail;
     88     while(pHead != NULL && pHead->pLeft != NULL)
     89         pHead = pHead->pLeft;
     90     return pHead;
     91 }
     92 
     93 int main(){ 
     94     int TestTime = 3, k = 1; 
     95     while(k <= TestTime) 
     96     { 
     97         cout << "Test " << k++ << ":" << endl; 
     98 
     99         cout << "Create a tree: " << endl; 
    100         BTNode *pRoot = createBinaryTree(); 
    101         printBinaryTree(pRoot); 
    102         cout << endl; 
    103 
    104         DbList *DbListHead = treeToDList(pRoot); // pRoot translate to Double linked list.
    105 
    106         printDbList(DbListHead); 
    107         cout << endl; 
    108 
    109         releaseDbList(DbListHead); 
    110     } 
    111     return 0; 
    112 }
    View Code

    note: 按先序输入,0表示结束。
    样例输入:

    a. 10 6 4 0 0 8 0 0 14 12 0 0 16 00

    b. 0 (生成空树)

    c. 1

    d. 2 1 0 0 3 0 0

     28.字符串的全排列

    Go:  ( 3. 字符的排列组合 )

     相关例题:八皇后问题(可扩展为 n 皇后问题)

     题目:8 x 8国际象棋上,摆8 个皇后,求她们任两个不同行、不同列且不在同一对角线上的摆法个数。

    #include <stdio.h>
    int solutionNumber = 0;
    
    void print(int data[], int length)
    {
    	for(int i = 0; i < length; ++i)
    		printf("(%d, %d)  ", i+1, data[i]+1);
    	printf("
    ");
    }
    bool judge(int data[], int length)
    {
    	for(int i = 0; i < length; ++i)
    	{
    		for(int j = i +1; j < length; ++j)
    		{
    			if((j - i) == (data[j] - data[i]) || (j - i) == data[i] - data[j])
    				return false; // not the solution
    		}
    
    	}
    	return true;
    }
    void swap(int &a, int &b) // do not forget the reference.
    {
    	int tem = a;
    	a = b;
    	b = tem;
    }
    
    void permutation(int data[], int length, int begin)
    {
    	if(begin == length-1)
    	{
    		if(judge(data, length))
    		{
    		//	print(data, length);
    			++solutionNumber;
    		}
    		return;
    	}
    	for(int start = begin; start < length; ++start)
    	{
    		swap(data[start], data[begin]);
    		permutation(data, length, begin+1);
    		swap(data[start], data[begin]);
    	}
    }
    
    int main()
    {
    	int columnIndex[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};  /* 不在同行同列  */
    	permutation(columnIndex, 8, 0);              /*  判断是否可以不在同一对角线  */
    	printf("Number of Solution: %d
    ", solutionNumber);
    	return 0;
    }
    
  • 相关阅读:
    建立自己的开发知识库?分享制作电子书的经验
    海量Office文档搜索
    为什么要检测数据库连接是否可用
    多年的.NET开发,也只学会了这么几招
    总结一下ERP .NET程序员必须掌握的.NET技术
    菜单设计器(Menu Designer)及其B/S,C/S双重实现(B/S开源)
    软件公司为什么要加密源代码
    .NET开发中经常用到的扩展方法
    在Win8 Mertro 中使用SQLite
    SQLite
  • 原文地址:https://www.cnblogs.com/liyangguang1988/p/3701499.html
Copyright © 2020-2023  润新知