问题描述: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 10   /   \  6      14/  \    /   \4   8 12    16 转换成双向链表4=6=8=10=12=14=16. 首先我们定义的二元查找树 节点的数据结构如下: struct BSTreeNode { int m_nValue; // value of node BSTreeNode *left; // left child of node B…
问题描述: 写程序,求一棵二叉树中相距最远的两个节点之间的距离. 10/     \6      14/   \   /   \4    8 12    16 分析: 二叉树中最远的两个节点,要么是根和一个叶子节点,要么是两个叶子节点.   代码实现: // 11.cc #include <iostream> using namespace std; typedef struct BSTreeNode { int data; BSTreeNode *left; BSTreeNode *righ…
问题:有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环.1.如何判断一个链表是不是这类链表? 问题扩展:1.如果链表可能有环呢?2.如果需要求出两个链表相交的第一个节点呢? 分析: 在无环的情况下,如果两个链表有结点相同,那么它们下一结点也相同,如此可推出尾结点也相同. 那么只要判断两链表的尾结点是否相同.(O(len1+len2)) struct Node { int data; int Node *next; }; // if t…
问题描述: 输入一颗二元查找树,将该树转换为它的镜像树,即对每一个节点,互换左右子树.   例如输入:   6/    \4     12/ \   /   \2  5 8   16 输出:   6/     \12     4/   \   / \16  8 5  2 定义二元查找树的结点为: typedef struct BSTree { int data; BSTree* left; BSTree* right; } Node; 分析: 方法1:递归交换左右子树. // 15_1.cc #…
问题描述: 层遍历二叉树,同一层从左往右打印. 定义二元查找树的结点为: typedef struct BSTreeNode { int data; BSTreeNode *left; BSTreeNode *right; } Node; 例如输入二叉树:    6 /   \ 4    12/ \    / \2 5 8  16 输出:6 4 12 2 5 8 16.   分析: 二叉树的广度优先遍历.   代码实现: // 16.cc #include <deque> #include &…
问题描述: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 中最大的是: 4 5 9 10   分析: 2*2子数组的最大和.遍历求和,时间复杂度为O(mn).   代码实现: // 35.cc #include <iostream> #include <climits> using namespace std; ], int m, int n) { int max_sum = INT_MIN; int sum; ; i…
问题描述: 有两个整数序列a, b,大小都为n, 序列元素的值任意整数,无序. 要求:通过交换a, b 中的元素,使得sum(a)-sum(b),差最小. 例如: var a=[80, 40, 60, 10, 20, 30]; var b=[10, 20, 50, 40, 30, 20];   分析: 近似最优算法:当前数组a和数组b的和之差为:A = sum(a) – sum(b),a的第i个元素和b的第j个元素交换后,a和b的和之差为:A’ = (sum(a) – a[i] + b[j])…
问题描述: 输入一个整数n,求n的二进制表示中,一共有多少个1.例如n=8,二进制表示为00001000,二进制表示中有1个1.     分析: 如果一个数n不为0,那么n-1的二进制表示,与n的二进制表示相比,n的二进制表示最右边的1变为0,而最右边的1所对应的0全部变为1.其余位不受影响. 例如:n的二进制表示为****1000,则n-1的二进制表示为****0111,则n&(n-1)的二进制表示为****0000.将n二进制表示中最右边的1去掉了. 将n赋值为n&(n-1),继续循环…
问题描述: 一个台阶总共有n阶,一次可以跳1级或者2级.求总共有多少种跳法.   分析: 用f(n)表示n阶台阶总共有多少种跳法.n阶台阶,第一可以选择跳1阶或者2阶,则f(n) = f(n-1) + f(n-2).问题转化为斐波那契数列问题.   /      1                          n=1f(n)=        2                          n=2        \  f(n-1)+(f-2)               n>2…
问题描述: 打印所有到叶子节点长度为2的路径  10  /  \ 6   16 / \   / \ 4 8  14 18   / \    / \    \ 2  5  12 15 20 / 11   打印: [10 6 8] [6 4 2] [6 4 5] [16 14 15] [16 18 20] [14 12 11]   分析: 1, 对于树先做先序遍历. 2, 然后针对每个节点做检查,检查的内容是,是否含有长度为2的叶子节点路径. 3, 检查的过程是,设定一个depth,同时保存当前ro…