ldjhust

工欲善其事 必先利其器

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
上一页 1 ··· 6 7 8 9 10 11 12 13 下一页

2013年5月1日

摘要: 题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。例如输入:8/ \6 10/\ /\5 7 9 11输出:8/ \10 6/\ /\11 9 7 5二分查找树的节点数据结构为:1 struct BinaryTreeNode2 {3 int nData;4 5 BinaryTreeNode *lChild;6 BinaryTreeNode *rChild;7 };思路:很简单,每次交换根节点的左右子树直到也节点即可,直接上代码.递归方法: 1 void ChangeToMirr... 阅读全文
posted @ 2013-05-01 15:56 ldjhust 阅读(180) 评论(0) 推荐(0) 编辑

摘要: 题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15 和数字15。由于4+11=15,因此输出4 和11。思路:因为数组是升序排列的(即使没有排序,我们也可以先排下序),所以很简单,设置两个循环变量,左边循环指向数组第一个数的下标,右边循环变量指向数组最后一个数的下标,然后两个数求和与指定的数比较大小,若等于则找到了一组数,推出循环;若大于,则将右边的循环标量往左移一位,继续比较;若小与,则将左边循环变量往右移一位,继续比较,若一 阅读全文
posted @ 2013-05-01 14:52 ldjhust 阅读(292) 评论(1) 推荐(1) 编辑

摘要: 题目:输入一个单向链表,输出该链表中倒数第k 个结点。链表的倒数第0 个结点为链表的尾指针。链表数据结构定义如下:1 struct LISTNODE2 {3 int nData;4 5 LISTNODE *next;6 };思路:用两个指针,第一个指针先走k步,然后第二个指针指向第一个节点,开始和第一个指针一起往后走。注意:1、我假设这个链表有头节点,若要求链表无头节点,则代码需做修改,但核心思想是一样的 2、注意k的范围,对于k的各种取之给一个合适的反馈。基于以上分析,写出代码: 1 LISTNODE *GetLastKNode(LISTNODE *head, int k... 阅读全文
posted @ 2013-05-01 14:20 ldjhust 阅读(279) 评论(0) 推荐(0) 编辑

摘要: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义距离为两节点之间边的个数。写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。 二叉树的数据结构:1 struct BinaryTreeNode2 {3 int nData;4 5 BinaryTreeNode *lChild;6 BinaryTreeNode *rChild;7 }; 思路:这里的最大距离出现的地方有两种情况,一种是穿过根节点的两个叶节点的最大距离,另一种情况是左子树的最大距离或右子树的最大距离。对于前一种情况我们只需返回左右子树的深度再加上根节点下的两条边即可,因此我们可... 阅读全文
posted @ 2013-05-01 11:13 ldjhust 阅读(203) 评论(0) 推荐(0) 编辑

2013年4月30日

摘要: 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。思路:先反转整个字符串,再分别反转每一个单词。反转字符串代码: 1 void ReverseString(char *Str) 2 { 3 assert (Str != NULL); 4 5 int nLength = strlen (Str); 6 7 // 首先反转整个字符串 8 ReverseWord (Str, nLength); 9... 阅读全文
posted @ 2013-04-30 21:48 ldjhust 阅读(183) 评论(0) 推荐(0) 编辑

摘要: 输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如:输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / \ 6 10 / \ / \ 5 7 9 11因此返回true。但是如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。思路:由后序遍历的特点可知数组的最后一个元素是根节点,若它是某一颗二分查找树的后序便利的结果,那么前面的部分可以连续的分成来那个部分,左边部分是这个根节点的左子树,特点是都小于或等于这个根节点,右边部分是这个根节点的... 阅读全文
posted @ 2013-04-30 20:46 ldjhust 阅读(296) 评论(0) 推荐(0) 编辑

摘要: 给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。为了简化问题,我们假设俩个链表均不带环。思路:首先即使带环也没关系,我们只需将环断开就又转换成了判断两个不带环的单向链表是否相交的问题,因此我们归根结底只需给出判断两个不带环的单向链表是否相交的算法即可。 因为单向链表的节点只有一个指向下一个节点的指针,因此如果两个单向链表相交,那么他们一定一定是成‘Y’型,即他们的最后一个节点一定一样的,则这样个问题就转换成判断两个单向链表的最后一个节点是否相等的问题,分析到这里,接下来写代码就是轻轻松松: 注意,这里我们使用的链表是有头节点的,如果题目要求是无头节点的链表,那么代码还需做.. 阅读全文
posted @ 2013-04-30 17:12 ldjhust 阅读(305) 评论(0) 推荐(0) 编辑

摘要: 输入n 个整数,输出其中最小的k 个。例如输入1,2,3,4,5,6,7 和8 这8 个数字,则最小的4 个数字为1,2,3 和4。经典的TopK问题,因为需要最小的K个元素,所以只需创建并维持一个拥有K个元素的最大堆即可。创建一个拥有K个元素的最大堆的代码为: 1 void CreateMaxHeap(int *MaxHeap, int K) 2 { 3 assert (MaxHeap != NULL); 4 5 assert (K > 0); 6 7 // 从最后一个有子孩子的节点开始往下调整,一直到根节点,则这个最大堆就创建好了 8 for (int ... 阅读全文
posted @ 2013-04-30 15:42 ldjhust 阅读(432) 评论(0) 推荐(1) 编辑

摘要: 对于这个问题我们可以利用前序遍历搜索二叉树的每一条路径,并利用栈保存找到的路径,然后判断此路径是否符合要求,若符合要求则输出此路径,否则继续寻找下一条路径。即利用回溯和递归的思想。 基于上述分析,可写出如下获取并判断路径的方法: 1 void GetRoad(BinaryTreeNode *root, int *Stack, int nTop, int nSum, int nValue) 2 { 3 assert (root != NULL); 4 5 assert (Stack != NULL); 6 7 assert (nTop >= -1); 8 9 ... 阅读全文
posted @ 2013-04-30 14:36 ldjhust 阅读(300) 评论(0) 推荐(0) 编辑

摘要: 定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。要求函数min、push 以及pop 的时间复杂度都是O(1)。我们定义数据结构如下:1 struct StackElement2 {3 // 存储入栈元素4 int nData;5 6 // 存储栈中最小元素7 int Min;8 };节点中有两个属性,一个存储此节点中的内容,一个存储当前栈中的最小元素。则push函数代码为: 1 void Push(StackElement *Stack, int nTop, int nValue) 2 { 3 assert (Stack != NUL... 阅读全文
posted @ 2013-04-30 12:33 ldjhust 阅读(156) 评论(0) 推荐(0) 编辑

上一页 1 ··· 6 7 8 9 10 11 12 13 下一页