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. 顺时针打印矩阵

 #include <stdio.h>

 void printMatrix(int (*A)[], int rows, int columns)
{
if(rows < || columns < ) return;
int r1, r2, c1, c2;
r1 = c1 = , r2 = rows-, c2 = columns-;
while(r1 <= r2 && c1 <= c2) /* 打印结束时, r1 = r2+1, c1 = c2+1; */
{
for(int i = c1; i <= c2 && r1 <= r2; ++i)
printf("%d ", A[r1][i]);
++r1;
for(int i = r1; c1 <= c2 && i <= r2; ++i)
printf("%d ", A[i][c2]); /* 要保证 c1 <= c2 */
--c2;
for(int i = c2; i >= c1 && r1 <= r2; --i)
printf("%d ", A[r2][i]);
--r2;
for(int i = r2; i >= r1 && c1 <= c2; --i)
printf("%d ", A[i][c1]);
++c1;
}
printf("\n");
}
int main()
{
int test1[][] = {{, , },
{, , },
{, , }};
printMatrix(test1, , ); int test2[][] = {, , };
printMatrix(test2, , ); /* // first set int (*A)[1], then began called below.
int test3[3][1] = {{1}, {2}, {3}};
printMatrix(test3, 3, 1); int test4[1][1] = {1};
printMatrix(test4, 1, 1);
*/
return ;
}

     (

21. 包含 min  函数的栈

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

 #include <iostream>
#include <stack>
#include <cassert>
#include <string>
template<typename T> class Stack
{
public:
void push(T value);
void pop();
T min();
private:
std::stack<T> data;
std::stack<T> minData;
};
template<typename T> void Stack<T>::push(T value)
{
data.push(value);
if(minData.empty() || minData.top() >= value)
minData.push(value);
else
minData.push(minData.top());
}
template<typename T> void Stack<T>::pop()
{
assert(data.size() > && minData.size() > );
data.pop();
minData.pop();
}
template<typename T> T Stack<T>::min()
{
return minData.top();
} int main()
{
Stack<char> st;
std::string numbers;
while(std::cin >> numbers)
{
for(size_t i = ; i < numbers.length(); ++i) st.push(numbers[i]);
for(size_t i = ; i < numbers.length(); ++i)
{
std::cout << "st.min(): " << st.min() << std::endl;
st.pop();
}
}
return ;
}

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} ,可画出一颗二叉搜索树。

 #include <iostream>
/* verify the seq which should be the postOrder of a Binary Search Tree */
bool postOrderOfBST(int sequence[], int len)
{
if(sequence == NULL || len == ) return false;
bool answer = false;
int root = sequence[len-]; /* value of root node */ int leftLength = ;
for(; leftLength < len-; ++leftLength)
{
if(sequence[leftLength] > root) break;
}
/* verify right-subtree, should big than root */
for(int i = leftLength + ; i < len -; ++i)
{
if(sequence[i] < root) return false;
} int rightLength = len - - leftLength;
bool left = true, right = true;
if(leftLength > )
bool left = postOrderOfBST(sequence, leftLength);
if(rightLength)
bool right = postOrderOfBST(sequence+leftLength, rightLength);
return (left && right);
} void printResult(bool v)
{
std::cout << "Is LRD of a BFS? " ;
if(v) std::cout << "true" << std::endl;
else std::cout << "false" << std::endl;
}
int main()
{
std::cout << "Test 1: ";
int test1[] = {, , , , , , , , };
printResult(postOrderOfBST(test1, sizeof(test1) / )) ; std::cout << "Test 2: ";
int test2[] = {, , };
printResult(postOrderOfBST(test2, sizeof(test2) / )); std::cout << "Test 3: ";
int test3[] = {};
printResult(postOrderOfBST(test3, sizeof(test3) / )); return ;
}

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

 #include <iostream>
#include <string>
#include <vector>
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 != )
pRoot->pLeft = createBinaryTree(u);
if(v != )
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 = ){
if(root == NULL) { cout << "NULL"; return; };
string s;
for(int i = ; i < level; ++i) s += "\t";
cout << root->v << endl << s;
print(root->pLeft, level+);
cout << endl << s;
print(root->pRight, level+);
}
/******************************************************************/
void findPath(BTNode *root, int target, vector<int>& path, int curSum)
{
if(root == NULL) return;
curSum += root->v;
path.push_back(root->v);
if(!root->pLeft && !root->pRight && (curSum == target)) // root node is a leaf, get a path.
{
for(auto it = path.begin(); it != path.end(); ++it)
cout << *it << " ";
cout << endl;
}
findPath(root->pLeft, target, path, curSum);
findPath(root->pRight, target, path, curSum);
path.pop_back();
} void findPath(BTNode *root, int target)
{
if(root == NULL) return;
vector<int> path;
findPath(root, target, path, );
} int main(){
int TestTime = , k = ;
while(k <= TestTime)
{
int root;
cout << "Test " << k++ << ":" << endl; cout << "Create a tree: " << endl;
cin >> root;
BTNode *pRoot = createBinaryTree(root);
print(pRoot);
cout << endl; cout << "target : 22" << endl << "findPath :" << endl;
findPath(pRoot, ); release(pRoot);
}
return ;
}

Code

 26. 复杂链表的复制

 #include <stdio.h>
typedef char Elem;
typedef struct ComplexListNode
{
Elem e;
ComplexListNode *next;
ComplexListNode *sibling;
} ComplexList;
ComplexListNode Node[] = {};
/***************************************************************/
ComplexList* creatComplexList()
{
for(int i = ; i < ; ++i)
Node[i].e = i + 'A';
char u, v;
while((scanf("%c%c", &u, &v) == ) )
{
if(u >= 'A' && u <= 'Z' && v >= 'A' && v <= 'Z')
{
if(Node[u-'A'].next == NULL)
Node[u-'A'].next = &Node[v-'A'];
else if(Node[u-'A'].sibling == NULL)
Node[u-'A'].sibling = &Node[v-'A'];
}
if(getchar() == '\n') break;
}
return &Node[];
} void printComplexList(ComplexList *pHead)
{
ComplexListNode *p = pHead;
while(p != NULL)
{
printf("%c -> ", p->e);
p = p->next;
}
printf("NULL\n");
p = pHead;
while(p != NULL)
{
if(p->sibling != NULL)
{
printf("%c -> ", p->e);
printf("%c\t", p->sibling->e);
}
p = p->next;
}
}
/***************************************************************************/
void cloneNodes(ComplexList *pHead)
{
ComplexListNode *p = pHead;
while(p != NULL)
{
ComplexListNode *newNode = new ComplexListNode;
newNode->e = p->e + ;
newNode->next = p->next;
newNode->sibling = NULL;
p->next = newNode;
p = newNode->next;
}
} void connectSibling(ComplexList *pHead)
{
ComplexListNode *pPre = pHead, *p;
while(pPre != NULL && pPre->next != NULL)
{
p = pPre->next;
if(pPre->sibling != NULL)
p->sibling = pPre->sibling->next;
pPre = p->next;
}
} ComplexList* getClonedComplexList(ComplexList *pHead)
{
ComplexListNode *pPre = pHead, *newHead = NULL, *p;
while(pPre != NULL && pPre->next != NULL)
{
if(newHead != NULL)
{
p->next = pPre->next;
p = p->next;
}
else
{
newHead = pPre->next;
p = newHead;
}
pPre->next = pPre->next->next;
pPre = pPre->next;
}
return newHead;
} ComplexList* clone(ComplexList *pHead)
{
cloneNodes(pHead);
connectSibling(pHead);
return getClonedComplexList(pHead);
} int main()
{
ComplexList *pHead = creatComplexList();
printf("original List.\n");
printComplexList(pHead); ComplexList *newHead = clone(pHead);
printf("cloned List.\n");
printComplexList(newHead); printf("original List.\n");
printComplexList(pHead); return ;
}

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

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

 #include <iostream>
#include <string>
using namespace std;
typedef struct BTNode
{
int v; // In this code, default positive Integer.
BTNode *pLeft;
BTNode *pRight;
BTNode(int x) : v(x), pLeft(NULL), pRight(NULL) {}
} DbList;
/********************************************************/
/***** Basic functions for binary tree ***********/
BTNode* createBinaryTree() // input a preOrder sequence, 0 denote empty node.
{
BTNode *pRoot = NULL;
int r;
cin >> r;
if(r != ) // equal to if(!r) return;
{
pRoot = new BTNode(r);
pRoot->pLeft = createBinaryTree();
pRoot->pRight = createBinaryTree(); }
return pRoot;
} void printBinaryTree(BTNode *root, int level = ){
if(root == NULL) { cout << "NULL"; return; };
string s;
for(int i = ; i < level; ++i) s += " ";
cout << root->v << endl << s;
printBinaryTree(root->pLeft, level+);
cout << endl << s;
printBinaryTree(root->pRight, level+);
} // void releaseBinaryTree(BTNode *root){
// if(root == NULL) return;
// releaseBinaryTree(root->pLeft);
// releaseBinaryTree(root->pRight);
// delete[] root;
// root = NULL;
// }
/******************************************************************/
/****************** basic function for double linked list. *******/
void printDbList(DbList *pHead)
{
if(pHead == NULL) return;
DbList *p = pHead;
cout << "Print from left to right:" << endl;
while(p->pRight != NULL) { cout << p->v << " "; p = p->pRight;}
cout << p->v << endl; cout << "Print from left to right:" << endl;
while(p != NULL) { printf("%-3d", p->v); p = p->pLeft;}
cout << endl;
}
void releaseDbList(DbList *pHead)
{
if(pHead == NULL) return;
releaseDbList(pHead->pRight);
delete[] pHead;
}
/******************************************************************/
/***** binary search tree translate to double linked list ******/
void convert(BTNode *root, BTNode **tail)
{
if(root == NULL) return; if(root->pLeft != NULL)
convert(root->pLeft, tail);
root->pLeft = *tail;
if(*tail)
(*tail)->pRight = root;
*tail = root; if(root->pRight != NULL)
convert(root->pRight, tail);
}; BTNode* treeToDList(BTNode *root)
{
if(root == NULL) return NULL;
BTNode *tail = NULL;
convert(root, &tail);
BTNode *pHead = tail;
while(pHead != NULL && pHead->pLeft != NULL)
pHead = pHead->pLeft;
return pHead;
} int main(){
int TestTime = , k = ;
while(k <= TestTime)
{
cout << "Test " << k++ << ":" << endl; cout << "Create a tree: " << endl;
BTNode *pRoot = createBinaryTree();
printBinaryTree(pRoot);
cout << endl; DbList *DbListHead = treeToDList(pRoot); // pRoot translate to Double linked list. printDbList(DbListHead);
cout << endl; releaseDbList(DbListHead);
}
return ;
}

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("\n");
}
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\n", solutionNumber);
return 0;
}

Chap4: question: 19 - 28的更多相关文章

  1. ubuntu下设置jupyter notebook 2017年07月29日 19:28:34 小旋锋 阅读数:8329 标签: ubuntu 更多 个人分类: python 二三事 来源:http://blog.csdn.net/suzyu12345/article/details/51037905 Ipython Notebook现在已经改名为Ipython jupyter,是最知名最好用的

    ubuntu下设置jupyter notebook     来源:http://blog.csdn.net/suzyu12345/article/details/51037905 Ipython No ...

  2. 根据pid获得路径 2006-10-25 19:28

    这是编写kill process时用到的 BOOL GetProcessModule(DWORD dwPID, DWORD dwModuleID, LPMODULEENTRY32 lpMe32, DW ...

  3. JavaSE_ IO流 总目录(19~22)

    JavaSE学习总结第19天_IO流119.01 集合的特点和数据结构总结19.02 如何选择使用哪种集合19.03 集合常见功能和遍历方式总结19.04 异常的概述和分类19.05 JVM默认处理异 ...

  4. JavaSE学习总结第19天_IO流1

      19.01  集合的特点和数据结构总结 HashSet.HashMap.Hashtable判断元素唯一性的方式: 通过对象的hashCode和equals方法来完成元素唯一性 如果对象的hashC ...

  5. 1Z0-050

    QUESTION 13 View the Exhibit.Examine the following command that is executed for the TRANSPORT table ...

  6. A.Kaw矩阵代数初步学习笔记 5. System of Equations

    “矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...

  7. .NET运用AJAX 总结及其实例

    1.AJAX简介 (1.没有AJAX会怎么样?普通的ASP.Net每次执行服务端方法的时候都要刷新当前页面,比如实现显示服务器的时间.每次都要刷新页面的坏处:页面刷新打断用户操作.速度慢.增加服务器的 ...

  8. 转:switch内部的变量定义问题(goto类似)

    自我总结:(之前查过goto和switch的资料但是一直没有搞懂,直到今天看到这个讨论才懂了) 1   int a;    是个描述,而不是个命令,只是说明我需要空间,编译器会保证在相应的作用域之中这 ...

  9. HTML+CSS+JAVASCRIPT 总结

    1. HTML 1: <!doctype html> 2: <!-- This is a test html for html, css, javascript --> 3: ...

随机推荐

  1. 拓扑编号 vijos1790

    题意就是拓扑排序,要求1的序号尽可能小,然后2的序号尽可能小,3,4... 一开始很容易想到直接贪心,每次选一个入度为0的点,如果有多个,就选编号最小的那个,但是很容易找到反例. 看了下题解,应该是反 ...

  2. 使用PYTHON实现docx文档的读写

    经常写文章的小白们会遇到这样的问题,知道想表达的意思,想出了大概描述的词汇,但就是缺乏完整漂亮的句子,也许曾经在某个地方看到过,但是找不到了.另外一种情况,阅读了大量的报告,用的时候想到了其中的某个结 ...

  3. CPU指令系统

    CPU就是通过指令系统来操控寄存器然后实现读取数据的,所以我们必须介绍一下CPU的指令系统 如果我们知道指令的英文全称,这对我们理解指令的作用有很大帮助,所以贴出指令英文全称 接下来就是介绍一些主要的 ...

  4. R on Ubuntu

    I have been using R recently. R is statistics programming language. R has attracted more and more at ...

  5. 《C++primer》v5 第3章 字符串、向量和数组 读书笔记 习题答案

    本章问题 1.char *p="hello world";与char p[]="hello world"的问题. 简单说前者是一个指向字符串常量的指针,后者是一 ...

  6. VC中预处理指令与宏定义详解

    刚接触到MFC编程的人往往会被MFC 向导生成的各种宏定义和预处理指令所吓倒,但是预处理和宏定义又是C语言的一个强大工具.使用它们可以进行简单的源代码控制,版本控制,预警或者完成一些特殊的功能. 一个 ...

  7. RABBITMQ/JAVA (主题)

    上篇博文中,我们进一步改良了日志系统.即使用Direct类型的转换器,使得接受者有能力进行选择性的接收日志,而非fanout那样,只能够无脑的转发. 虽然使用Direct类型的转换器改进了日志系统.但 ...

  8. HDU5000 (DP + 规律)

    题意:举例子好说点,告诉你4个数字,8,6,4,2四个数字,组成一个四位数,如果两个数字分别是1111,2222,则2222会吧1111杀掉,就是组成的四位数不能每一位都小于或等于一个数,然后让你求出 ...

  9. 浅谈SEO-提交(一)

    前段时间,花了点时间研究了下SEO,Search Engine Optimization,百度百科这样描述: 中文意译为“搜索引擎优化”.SEO是指通过对网站内部调整优化及站外优化,使网站满足搜索引擎 ...

  10. 服务器自己用户名下编译gcc

    要点: 1.上传gcc 学习命令 scp 具体格式: scp local_file remote_username@remote_ip:remote_folder scp /home/linux/so ...