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. bzoj 2763: [JLOI2011]飞行路线

    #include<cstdio> #include<cstring> #include<iostream> #include<queue> #defin ...

  2. HDU 1402 fft 模板题

    题目就是求一个大数的乘法 这里数字的位数有50000的长度,按平时的乘法方式计算,每一位相乘是要n^2的复杂度的,这肯定不行 我们可以将每一位分解后作为系数,如153 = 1*x^2 + 5*x^1 ...

  3. JS日期的获取与加减

    1)获取当前日期: var today = new Date(); 2)设定某个日期: var d = new Date("2015/1/08".replace(/-/g,&quo ...

  4. Spark随笔(二):深入学习

    一.如何选择粗粒度和细粒度 从底层往上引申来理解粗粒度与细粒度. 一层:一个类,具有三个属性值.为了查询这个类的所有实例,细粒度查询的程度为属性值,即依次查询每个实例化对象的属性值,查询三次:粗粒度按 ...

  5. BZOJ 2595 斯坦那树

    很久以前就想做,后来弃坑了. 最近又在群里有人问了类似的问题,艾老师说是斯坦纳树(%%%) 就是状压DP,然后用Spfa对状态进行转移. #include <iostream> #incl ...

  6. PAT (Basic Level) Practise:1016. 部分A+B

    [题目链接] 正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA.例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6. 现给定A.DA. ...

  7. ArrayBlockingQueue-我们到底能走多远系列(42)

    我们到底能走多远系列(42) 扯淡: 乘着有空,读些juc的源码学习下.后续把juc大致走一边,反正以后肯定要再来. 主题: BlockingQueue 是什么 A java.util.Queue t ...

  8. python数据结构与算法——字典树

    class TrieTree(): def __init__(self): self.root = {} def addNode(self,str): # 树中每个结点(除根节点),包含到该结点的单词 ...

  9. [原创] 用两个queue实现stack的功能

    #include <iostream> #include <queue> using namespace std; template <class T> class ...

  10. popwindow设置背景半透明

    WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.alpha = 0.5f; //0.0-1.0 getWindow(). ...