摘要: 本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:给定二叉查找树的一个结点, 写一个算法查找它的“下一个”结点(即中序遍历后它的后继结点), 其中每个结点都有指向其父亲的链接。思路:题目是在升序排列的情况下,查找他的下一个的节点。先在它的右孩子里找最小的节点,即下一个节点;如果没有右孩子,那么向上找它的父亲节点,直到找到比他大的父亲节点,即下一个节点。(如果他是他父亲节点的右孩子,那么继续向上找直到找到某个节点是其父亲节点的左孩子,那么该父亲节点就是所找的下一个节点;如果他 阅读全文
posted @ 2014-03-25 16:17 哈士奇.银桑 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:给定一棵二叉查找树,设计算法,将每一层的所有结点构建为一个链表(也就是说, 如果树有D层,那么你将构建出D个链表)思路:定义一个保存链表头节点指针的数组,现将2叉树跟节点放入到数组p_nl[0]中,跟节点层就一个节点,跟节点层链表构建完毕。进行循环,遍历已构造的链表,将链表中的节点的孩子节点插入到新链表。最后,直到遍历完叶子节点链表。链表全部构造完成。其中有不相关的代码。CODE: 1 #include 2 #inclu.. 阅读全文
posted @ 2014-03-22 16:36 哈士奇.银桑 阅读(387) 评论(0) 推荐(0) 编辑
摘要: 本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:给定一个有序数组(递增),写程序构建一棵具有最小高度的二叉树。思路:取数组中间元素当作二叉树的根,递归插入。CODE: 1 #include 2 #include 3 #include 4 #define N 6 5 #define key(A) (A) 6 #define less(A,B) (Aend)16 return;17 (*h)=(node *)malloc(sizeof(node));1... 阅读全文
posted @ 2014-03-20 08:51 哈士奇.银桑 阅读(111) 评论(0) 推荐(0) 编辑
摘要: 本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:实现一个函数检查一棵树是否平衡。对于这个问题而言, 平衡指的是这棵树任意两个叶子结点到根结点的距离之差不大于1。思路:找这棵树的最高层max,和最低层min,比较下即可。CODE: 1 #include 2 #include 3 #include 4 #define N 6 5 #define key(A) (A) 6 #define less(A,B) (Aitem=item;18 (*h)->l=NULL... 阅读全文
posted @ 2014-03-19 14:31 哈士奇.银桑 阅读(90) 评论(0) 推荐(0) 编辑
摘要: 本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:写程序将一个栈按升序排序。对这个栈是如何实现的,你不应该做任何特殊的假设。 程序中能用到的栈操作有:push | pop | peek | isEmpty。思路:需要一个额外的栈ss[1],原栈ss[0]弹出数据data,当ss[1]为空时候,直接压入;ss[1]不为空时,如果ss[1]的栈顶数据大于ss[0]弹出的数据data时,弹出ss[1]数据,压入ss[0]中,知道ss[1]中的数据不大于ss[0]弹出的data,压 阅读全文
posted @ 2014-03-18 15:40 哈士奇.银桑 阅读(135) 评论(0) 推荐(0) 编辑
摘要: 本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:使用两个栈实现一个队列MyQueue。思路:一个入栈(ss[0]),另一个(ss[1])将ss[0]弹出的数据压入,这样就可以先进先出(FIFO)了。CODE: 1 #include 2 #define N 10 /*栈的长度*/ 3 typedef struct 4 { 5 int s[N]; 6 int top; 7 }struct_stack; 8 int ssFull(struct_stack... 阅读全文
posted @ 2014-03-17 10:51 哈士奇.银桑 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:编程解决汉诺塔问题,使用数据结构栈.思路:1.递归:分成3个状态:将src上的1~n-1个盘子借助dst移到bri上。将src上的剩下的第n个盘子移动到dst上。将bri上的1~n-1个盘子借助src移动到dst上。参考:http://hawstein.com/posts/3.4.html2.使用栈的非递归:另一种汉诺塔移动方式:3个柱子呈品字型放置,形成循环。如果盘子数目n是奇数,那么排放方式:A-》C-》B;如果是偶数, 阅读全文
posted @ 2014-03-14 21:10 哈士奇.银桑 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:栈就像叠盘子,当盘子叠得太高时,就会倾斜倒下。因此,在真实的世界中,当一叠盘子 (栈)超过了一定的高度时,我们就会另起一堆,再从头叠起。实现数据结构SetOfStacks 来模拟这种情况。SetOfStacks由几个栈组成,当前一栈超出容量时,需要创建一个新的栈 来存放数据。SetOfStacks.push()和SetOfStacks.pop()的行为应当和只有一个栈时 表现的一样。进一步地,实现函数popAt(int in 阅读全文
posted @ 2014-03-13 09:22 哈士奇.银桑 阅读(124) 评论(0) 推荐(0) 编辑
摘要: 本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:实现一个栈,除了push和pop操作,还要实现min函数以返回栈中的最小值。 push,pop和min函数的时间复杂度都为O(1)。思路:额外建立一个保存栈中目前最小值的数组gpStacMin[],如果入栈的数据小于等于gpStacMin中的栈顶数据,同时入栈。弹出时候,只要弹出的栈顶元素和gpStacMin中的栈顶数据相等,同时弹出。 1 #include 2 #include 3 #define N 10 4 int * 阅读全文
posted @ 2014-03-11 09:17 哈士奇.银桑 阅读(140) 评论(0) 推荐(0) 编辑
摘要: 本文参考该作者文章当作编程笔记:作者:Hawstein出处:http://hawstein.com/posts/ctci-solutions-contents.htmlQ:你如何只用一个数组实现三个栈?思路:创建一个结构数组sn,数组中的每个元素将是这样一个结点,它保存当前位置的值item,和指向上一个结点的索引preindex。这样弹出该栈的栈顶值时,可以找到上一个该栈元素。注意:当弹出栈顶值时,如果该栈顶索引小于数组当前的索引C,那么将C指向该栈顶索引。这样可以不浪费空间。CODE: 1 #include 2 #include 3 #define N 10 4 #define EMPTY 阅读全文
posted @ 2014-03-10 10:48 哈士奇.银桑 阅读(146) 评论(0) 推荐(0) 编辑