出题:把二元查找树转变成排序的双向链表。输入一棵二元查找树,要求将该二元查找树按照中序转换成一个排序的双向链表,要求不能创建任何新的节点,只能调整指针的指向;

分析:

  • 递归的思路,当前节点需要进行的处理,并使用递归调用和返回值将子问题链接起来;
  • 首先明白二元查找树的特性,变成有序双向链表后当前根节点的左节点为其原来左子树的最右节点,右节点为其原来右子树的最左节点;因此策略就是针对当前根节点索引的子树,首先判断其为上层节点的右子树还是左子树,从而决定返回最右还是最右节点;然后再递归处理当前根节点的左右子树;

解题:

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <string.h>
  4.  
  5. typedef struct Node {
  6. int value;
  7. Node *left;
  8. Node *right;
  9. } *NodePtr;
  10.  
  11. Node* MostLeft(Node *current) {
  12. Node* temp=current;
  13. while(temp->left!=NULL) {
  14. temp=temp->left;
  15. }
  16. return temp;
  17. }
  18.  
  19. Node* MostRight(Node *current) {
  20. Node* temp=current;
  21. while(temp->right!=NULL) {
  22. temp=temp->right;
  23. }
  24. return temp;
  25. }
  26.  
  27. Node* Transfer(Node *current, bool isRight) {
  28.  
  29. if(current==NULL) return NULL;
  30. /**
  31. * 在树结构被破坏之前预先查找好需要返回的节点
  32. * */
  33. Node* turnback = (isRight ? MostLeft(current) : MostRight(current));
  34. /**
  35. * 递归处理左右子树,将具体返回的节点推迟到子树解决
  36. * */
  37. if(current->left!=NULL) {
  38. current->left=Transfer(current->left,false);
  39. current->left->right=current;
  40. }
  41. if(current->right!=NULL) {
  42. current->right=Transfer(current->right,true);
  43. current->right->left=current;
  44. }
  45. /**
  46. * 根据isRight的值,和current是否有左右子树返回不同的节点
  47. * */
  48. return turnback;
  49. }

出题:定义stack数据结构,除Push和Pop函数外要求增加Min函数,其功能是找到stack中最小的元素,要求所有函数时间复杂度都是O(1);

分析:

  • 使用辅助stack结构依次将目前的最小元素压入栈,设置CurMin元素记录当前stack中的最小元素,每次Push的新元素都与CurMin比较,若新元素更小则将其压入辅助栈;每次Pop元素都与CurMin比较,若就是CurMin元素则将辅助栈栈顶元素出栈;

解题:

  1. class MyStack {
  2. private:
  3. int *array;
  4. int capability;
  5. int length;
  6. int head;
  7. int tail;
  8. public:
  9. MyStack(int n=): array((int*)malloc(sizeof(int)*n)), head(),tail(),capability(n), length() {}
  10. ~MyStack() {delete [] array;}
  11.  
  12. bool isFull() {
  13. if(length == capability) return true;
  14. return false;
  15. }
  16. bool isEmpty() {
  17. if(length == ) return true;
  18. return false;
  19. }
  20. /**
  21. * head当前的指向位置是下一次将push的元素的
  22. * */
  23. bool push(int n) {
  24. if(isFull()) return false;
  25. array[head]=n;
  26. head=(head+)%(capability+);
  27. length++;
  28. return true;
  29. }
  30. /**
  31. * tail当前指向的位置是下一次将pop的元素的
  32. * */
  33. bool pop(int *n) {
  34. if(isEmpty()) return false;
  35. *n=array[tail];
  36. tail=(tail+)%(capability+);
  37. length--;
  38. return true;
  39. }
  40.  
  41. void showStack() {
  42. int i=tail;
  43. int temp=length;
  44. printf("\nnew path\n");
  45. while(temp>) {
  46. printf("%d, ",array[i++]);
  47. temp--;
  48. }
  49. }
  50. };
  51.  
  52. class MinStack {
  53. private:
  54. MyStack *mainStack;
  55. MyStack *assiStack;
  56. int curMin;
  57. public:
  58. MinStack(): mainStack(new MyStack()),assiStack(new MyStack()),curMin() {}
  59. /**
  60. * 仅当出现新的最小元素时,才将前一个最小元素压入assiStack
  61. * */
  62. bool push(int n) {
  63. if(mainStack->push(n)) {
  64. if(n<curMin) {
  65. assiStack->push(curMin);
  66. curMin=n;
  67. }
  68. return true;
  69. }
  70. return false;
  71. }
  72. /**
  73. * 仅当mianStack的pop元素等于curMin时,才从assiStack中新pop出一个元素
  74. * */
  75. bool pop(int *n) {
  76. if(mainStack->pop(n)) {
  77. if(*n == curMin) {
  78. int *temp;
  79. assiStack->pop(temp);
  80. curMin=*temp;
  81. }
  82. return true;
  83. }
  84. return false;
  85. }
  86. int min() {
  87. return curMin;
  88. }
  89. };

笔试算法题(05):转换BST为双向链表 & 查找栈中的最小元素的更多相关文章

  1. 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)

    议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...

  2. 笔试算法题(24):找出出现次数超过一半的元素 & 二叉树最近公共父节点

    出题:数组中有一个数字出现的次数超过了数组长度的一半,请找出这个数字: 分析: 解法1:首先对数组进行排序,时间复杂度为O(NlogN),由于有一个数字出现次数超过了数组的一半,所以如果二分数组的话, ...

  3. 笔试算法题(34):从数字序列中寻找仅出现一次的数字 & 最大公约数(GCD)问题

    出题:给定一个数字序列,其中每个数字最多出现两次,只有一个数字仅出现了一次,如何快速找出其中仅出现了一次的数字: 分析: 由于知道一个数字异或操作它本身(X^X=0)都为0,而任何数字异或操作0都为它 ...

  4. 笔试算法题(15):-1到N中包含1的数字的个数 & 连续和为N的序列

    出题:输入一个整数N,求从1到N这N个整数的十进制表示中‘1’出现的次数: 分析: 从左向右处理string表示的数字:当前数字长度为n,判断最左边一位数字字符: 如果是0,则直接递归下一位: 如果是 ...

  5. 笔试算法题(14):整数二进制表示中的1 & 判定栈的push和pop序列是否对应

    出题:输入一个整数,要求计算此整数的二进制表示中1的个数 分析: 如果整数表示为k,当其是负数的时候,使用1<<i分别检测k的每一位:当其位整数的时候,则k/2表示将其二进制表示右移一位, ...

  6. 笔试算法题(22):二分法求旋转数组最小值 & 骰子值概率

    出题:将一个数组最开始的k个(K小于数组大小N)元素照搬到数组末尾,我们称之为数组的旋转:现在有一个已经排序的数组的一个旋转,要求输出旋转数组中的最小元素,且时间复杂度小于O(N): 分析: 时间复杂 ...

  7. 【python】Leetcode每日一题-寻找旋转排序数组中的最小元素

    [python]Leetcode每日一题-寻找旋转排序数组中的最小元素 [题目描述] 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组nums ...

  8. 【python】Leetcode每日一题-寻找旋转排序数组中的最小元素2

    [python]Leetcode每日一题-寻找旋转排序数组中的最小元素2 [题目描述] 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组nums ...

  9. 笔试算法题(31):将有序数组转换成BST表示 & 线段树的应用

    出题:要求将一个有序整数数组转换成最小深度的Binary Search Tree表示: 分析:由于需要是最小深度,所以BST应保持平衡,左右节点数大致相当,并且BST中当前根节点大于所有其左子树中的元 ...

随机推荐

  1. 关于XAMPP Apache无法启动问题解决方案

    安装好XAMPP后,启动Apache服务启动失败,然后从xampp安装目录下执行apache_start.bat文件,如下图 显示443端口被占用. 解决方法: 启动cmd,输入netstat -a  ...

  2. 0 Java实现 一篇文章说尽设计模式之六大原则

    我们知道,设计模式很有用,学好设计模式不但能让你写出更简洁,优雅的代码,还能使得代码的结构更清晰,也更有利于扩展 当然设计模式也不是万能的,一成不变的.设计模式只是前人总结出来的一种经验,一种特定问题 ...

  3. bzoj 1089: [SCOI2003]严格n元树【dp+高精】

    设f[i]为深度为i的n元树数目,s为f的前缀和 s[i]=s[i-1]^n+1,就是增加一个根,然后在下面挂n个子树,每个子树都有s[i-1]种 写个高精就行了,好久没写WA了好几次-- #incl ...

  4. Selenium定位多个iframe嵌套中的元素

    在公司boss系统中,经常会遇到多层iframe嵌套的情况,导致无法定位最里面那层iframe的元素. 其实很简单,只要一层层定位iframe,定位到你想要的那层iframe即可: 如果操作完需要返回 ...

  5. HTTP/0.9、HTTP/1.0、HTTP/1.1、HTTP/2 历史演变和设计思路(详)*

    HTTP 协议是互联网的基础协议,也是网页开发的必备知识,最新版本 HTTP/2 更是让它成为技术热点. 本文介绍 HTTP 协议的历史演变和设计思路. 一.HTTP/0.9 HTTP 是基于 TCP ...

  6. *关于TCP长连接,NAT超时,心跳包

    参考: http://www.jianshu.com/p/584707554ed7 1.TCP长连接 TCP连接建立后只要不明确关闭,逻辑上连接一直存在. TCP是有保活定时器的,可以打开保活定时器来 ...

  7. IOS 绘制PDF -转

    -(void)createPdf:(UIImage *)img andText:(NSString *)text{ NSArray *paths = NSSearchPathForDirectorie ...

  8. iOS9 关于明文HTTP报错的修复方法

    报错:App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. ...

  9. 229 Majority Element II 求众数 II

    给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素. 你的算法应该在O(1)空间中以线性时间运行. 详见:https://leetcode.com/problems/major ...

  10. SQL Server Management Studio 手动导入Excel文件

    SQL Server Management Studio(企业管理器) 手动导入Excel文件,有时间还是非常方便的,省去了写代码的麻烦. 具体步骤如下: 下面附上 创建游标的方法(用于循环读取临时表 ...