数据结构及算法的一些题目整理

  • 时间:
  • 浏览:2
  • 来源:幸运飞艇APP下载_幸运飞艇APP官方

7

BSTreeNode *treeToLinkedList(BSTreeNode *root){

9

~CQueue() {}

5

4.查找最小的k个元素题目:输入n个整数,输出其中最小的k个。相似输入1,2,3,4,5,6,7和8这8个数字,则最小的八个 多数字为1,2,3和4。

9

辅助栈中的数据始终保持最小值在栈顶,都要获取最小值时,直接Peek()辅助栈即可。



5.二元查找树的后序遍历结果

7

T> m_stack1;

CQueue() {}

6

12

20.二元树的下行速率

输入一棵二元树的根结点,求该树的下行速率 。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的第一根路径,最长路径的长度为树的下行速率 。相似:输入二元树:

    */

void deleteHead(); 

5

21.栈的push、pop序列

输入八个 多整数序列。其中一八个 多序列表示栈的push顺序,判断如此 序列有如此其他是对应的pop顺序。为了简单起见,让让我们 歌词 假设push序列的任意八个 多整数否是不相等的。比如输入的push序列是1、2、3、4、5,如此4、5、3、2、1否是其他是一八个 多pop系列。其他都都要有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,如此 得到的pop序列很多很多4、5、3、2、1。但序列4、3、5、1、2就不其他是push序列1、2、3、4、5的pop序列。

7.单链表就地逆置就地逆置,指不借助任何顶端变量进行链表逆置

9

11

8.判断八个 多链表否是是相交给出八个 多单向链表的头指针,比如h1,h2,判断這個 个多链表否是是相交。为了错综复杂现象,让让我们 歌词 假设八个 多链表均不带环。现象扩展:1.其他链表其他有环列?2.其他都要求出八个 多链表相交的第一八个 多节点列?

15

16.判断二叉树否是是平衡

输入一棵二叉树的根结点,判断该树否是是平衡二叉树。其他某二叉树中任意结点的左右子树的下行速率 相差不超过1,如此它很多很多一棵平衡二叉树。相似下图中的二叉树很多很多一棵平衡二叉树:

17.两链表的第一八个 多公共结点

八个 多单向链表,找出它们的第一八个 多公共结点。链表的结点定义为:

1

}

19.从尾到头输出链表

输入一八个 多链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:

struct ListNode

8

3

        int n_value;

本文转自邴越博客园博客,原文链接:http://www.cnblogs.com/binyue/p/363039.html,如需转载请自行联系原作者

5

9

函数的声明如下:

void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);

相似输入5、7、6、9、11、10、8,其他這個 整数序列是如下树的后序遍历结果:

2

1

struct ListNode

2

       if(node==null)     

1

3.字符串匹配算法:朴素的匹配算法(Brute Force 暴力搜索)、KMP算法。

字符串匹配现象很多很多在一八个 多大的字符串T中搜索某个字符串P的所有突然出现位置。其中,T称为文本,P称为模式,T和P都定义在同一八个 多字母表∑上。

17

        BSTreeNode *pright;

3.在二元树中找出和为某一值的所有路径

题目:输入一八个 多整数和一棵二元树。从树的根结点开使英文往下访问突然到叶结点所经过的所有结点形成第一根路径。打印出和与输入整数相等的所有路径。相似 输入整数22和如下二元树10 / \ 5 12 / \ 4 7则打印出两条路径:10, 12和10, 5, 7。

3

8

/ \ / \

7

24.从上往下遍历二元树

输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。

7

{

};

分析:

在链表中删除一八个 多结点,最常规的做法是从链表的头结点开使英文,顺序查找要删除的结点,找到后后再删除。其他都要顺序查找,时间错综复杂度自然很多很多O(n) 了。让让我们 歌词 并非 都要从头结点开使英文查找要删除的结点,是其他让让我们 歌词 都要得到要删除的结点的前面一八个 多结点。让让我们 歌词 试着换這個 思路。让让我们 歌词 都都要从给定的结点得到它的下一八个 多结点。這個 后后让让我们 歌词 实际删除的是它的下一八个 多结点,其他让让我们 歌词 其他得到实际删除的结点的前面一八个 多结点,其他完否是都都要实现的。当然,在删除后后,让让我们 歌词 都要都要把给定的结点的下一八个 多结点的数据拷贝到给定的结点中。此时,时间错综复杂度为O(1)。

10

     }    

}

3

5

22.反转链表

输入一八个 多链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:

13

3

10.实现一八个 多队列。

队列的应用场景为:一八个 多生产者守护程序运行运行将int类型的数入列,一八个 多消费者守护程序运行运行将int类型的数出列

2.设计含高min函数的栈定义栈的数据行态,要求加进一八个 多min函数,并能得到栈的最小元素。要求函数min、push以及pop的时间错综复杂度否是O(1)。

相似输入

3

8

4

5

3

ListNode* m_pNext;

public:

16

           return head;

template<typename T> class CQueue

12

5

};

4

13.找出链表的第一八个 多公共结点(链表)。题目:八个 多单向链表,找出它们的第一八个 多公共结点。链表的结点定义为:struct ListNode{int m_nKey;ListNode* m_pNext;};

输出8 6 10 5 7 9 11。

4

12

10

15.把二元查找树转变成排序的双向链表

输入一棵二元查找树,将该二元查找树转加进一八个 多排序的双向链表。要求如此创建任何新的结点,只调整指针的指向。  比如将二元查找树10/ \6 14/ \ /  \ 4 8 12   16转加进双向链表4=6=8=10=12=14=16

int m_nKey;

8

其他返回true

比如将

11.用C++设计一八个 多如此被继承的类。

分析:这是Adobe公司307年校园招聘的最新笔试题。这道题除了考察应聘者的C++基本功底外,还能考察反应能力,是一道很好的题目。

           helper(head,tail,root);

       return;

10

/ \6 14/ \ /  \4 8 12 16转加进双向链表。

4

};

2

struct ListNode

4

1

分析:这到题除了考查对栈這個 基本数据行态的理解,还能考查让让我们 歌词 的分析能力。

     BSTreeNode *lft,*rgt;

       int right=getLevel(node.rightNode);

其他输入7、4、6、5,如此哪棵树的后序遍历的结果是這個 序列,其他返回false。

解答:中序遍历二叉查找树可得到一八个 多关键字的有序序列,一八个 多无序序列都都要通过构造一棵二叉查找树变成一八个 多有序序列,构造树的过程即为对无序序列进行查找的过程。

2

19

       head=NULL;

1. 数据行态的定义。

在计算机科学或信息科学中,数据行态(英语:data structure)是计算机中存储、组织数据的最好的土办法。通常清况 下,精心选泽的数据行态都都要带来最优下行速率 的算法。一般而言,数据行态的选泽首先会从抽象数据类型的选泽开使英文。一八个 多设计良好的数据行态,应该在尽其他使用较少的时间与空间资源的前提下,为各种临界清况 下的运行提供支持。数据行态可通过编程语言所提供的数据类型、引用及其他操作加以实现。不同种类的数据行态适合于不同种类的应用,而每段甚至专门用于特定的作业任务。相似,当计算机网络依赖于路由表运作时,B树下行速率 适用于数据库的封装。在其他类型的守护程序运行运行设计中,选泽适当的数据行态是一八个 多主要的考虑因素。其他大型系统的构造经验表明,封装的困难程度与最终成果的质量与表现,都取决于否是是选泽了最优的数据行态。在其他后后,选泽了数据行态后便能很容易地得到算法。而其他后后,思路则会颠倒过来:相似当某个关键作业都要特定数据行态下的算法时,会反过来选泽其所使用的数据行态。然而,不管是哪种清况 ,数据行态的选泽否是至关重要的。

12.在O(1)时间内删除链表结点(链表、算法)。

题目:给定链表的头指针和一八个 多结点指针,在O(1)时间删除该结点。链表结点的定义如下:struct ListNode{int m_nKey;ListNode* m_pNext;};函数的声明如下:void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);分析:考察编程基本功,反应下行速率 ,更重要的是,还能考察让让我们 歌词 对时间错综复杂度的理解。

2.栈的八个 多应用:括号匹配和表达式的计否是为什么么么在应用的?表达式计算用的是哪种表达最好的土办法?有什么好处?

符号的平衡现象在语言中往往都要判断其他符号否是是成对突然出现的,比如<>,{},[],(),通常在C++中也如此这几种对称现象,怎样才能让判断符号的对称也是很多很多代码判断的首要任务。当然实现的最好的土办法是多种多样的,采用栈的实现会相对更加简单。基本的实现思路如下:假设在读入一串字符串后后,其他遇到对称符号的左边每段,则将其压入栈中,当遇到对称符号的右边每段,则弹出栈中的一八个 多对象,实现比对,其他是对称的,则说明当前的符号是平衡的,其他不对称,则说明当前字符串是不平衡的,当字符串读完后后,其他所有的符号否是平衡的,栈中此时应该很多很多为空,通过判断栈中否是是为空,说明字符串否是是符号平衡的。表达式的求值现象主要涉及到操作符的优先级现象,比如()、*/、+-这几种符号的优先级是不一样的,其中括号的优先级最好,乘除其次,加减最低,让让我们 歌词 通常看了的表达式否是中缀表达式,也很多很多在操作符的两边否是对象,当然括号除外啦,這個 中缀表达式是不便于在守护程序运行运行中正确处理的,其他处在很多很多的优先级差别,好难把握从那个位置先计算。其他在表达式中如此了优先级的现象,求值现象也就变得相对来说更加简单,后缀表达式是這個 非优先级的表达式表示最好的土办法,其他怎样才能实现中缀表达式到后缀表达式的切换也是好难实现的。中缀表达式到后缀表达式的实现如下:中缀表达式:a*b+c*d-e/f后缀表达式:ab*cd*+ef/-从顶端的表达式都都要知道后缀表达式相对来说比较容易判断计算的基本过程,其他不处在括号的烦恼。采用栈实现转换的基本思路如下:对一八个 多中缀表达式进行遍历,当遇到非操作符的字符直接保存到后缀表达式的存储空间中,其他遇到左括号,则将左括号压入栈中,其他优先级最高,如此遇到右括号才会被弹出。其他遇到右括号,则将左括号后后的操作符全部弹出,并保存到后缀表达式的存储空间中,当然這個 存储的顺序和出栈的顺序是一致的,括号操作符在后缀表达式中是不处在的,其他不都要将括号保存到后缀表达式的存储空间中。其他遇到乘除操作符(*/),则判断栈中的操作符优先级否是是低于当前的操作符也很多很多判断否是是加减操作符,其他否是则将栈中的操作符(也很多很多*、/),并保存到后缀表达式存储空间中,其他将当前的操作符压入栈中,其他是则直接将操作符入栈。其他操作符是加减操作符,则弹出栈中左括号后后的所有操作符,并保存到后缀表达式存储空间中,其他将操作符這個 压入栈中。当字符串遍历完成后后,依次弹出操作符,并保存到后缀表达式存储区中。后缀表达式求值的现象实现了后缀表达式的转换,实现表达式的求值现象也就比较简单了,实现的基本思路如下:遍历后缀表达式,遇到非操作符的字符则直接压入栈中,其他遇到操作符则从栈中弹出八个 多对象,进行对应的操作,其他将计算的结果又压入栈中。继续遍历,直到表达式被遍历完成,此时栈中保存的值也很多很多当前表达式的值,都要注意除法和减法的操作数顺序现象以及除数如此为0的。

3

2

所需的双向链表的节点顺序是该二叉树的中序遍历结果,可在中序遍历时,对节点进行正确处理(改变左右孩子)。代码与中序遍历的算法相似,很多很多多加了一八个 多步骤。

T> m_stack2;

13

}

6.求二叉树中节点的最大距离

其他让让我们 歌词 把二叉树看成一八个 多图,父子节点之间的连线看成是双向的,让让我们 歌词 姑且定义"距离"为两节点之间边的个数。写一八个 多守护程序运行运行,求一棵二叉树中相距最远的八个 多节点之间的距离。

输入一八个 多整数数组,判断该数组否是是某二元查找树的后序遍历的结果。其他是返回true,其他返回false。

     if(root==NULL){

5 7 9 11

1

   public int getLevel(TreeNode node){

1

1

7

5 7 9 11

void appendTail(const T& node); 

struct ListNode

int m_nKey;

5

};

1

        BSTreeNode *pleft;

ListNode* m_pNext;

13

14

/ \

18.在O(1)时间删除链表结点

给定链表的头指针和一八个 多结点指针,在O(1)时间删除该结点。链表结点的定义如下:

1.把二叉搜索树转变成排序的双向链表

输入一棵二叉搜索树,将该二叉搜索树转加进一八个 多排序的双向链表。要求如此创建任何新的结点,只调整指针的指向。

{

23.用八个 多栈实现队列

某队列的声明如下:

ListNode* m_pNext;

/ \

       tail=NULL;

11

/**

   }

5.图有什么储存表示。

A.邻接矩阵图的邻接矩阵存储也称数组表示法,其最好的土办法是用一八个 多一维数组存储图中顶点的信息,用一八个 多二维数组存储图中边的信息(即各顶点之间的邻接关系),存储顶点之间邻接关系的二维数组称为邻接矩阵。B.邻接表对于图的每个顶点Vi,将所有邻接于的顶点Vi链成一八个 多单链表,称为顶点Vi的边表。为了方便对所有边表的头指针进行存取操作,都都要采取顺序存储。存储边表头指针的数组和存储顶点信息的数组构成了邻接表的表头数组,称为顶点表。很多很多,在邻接表中处在這個 节点行态:顶点表节点和边表节点。

输出该树的下行速率 3。

2

{

18

           return 0;

    * 获得树的下行速率

3

8

2

8

8

6

ListNode* m_pNext;

4.红黑树的定义,红黑树的性能分析和与二叉平衡树的比较。

红黑树与平衡二叉树的查找性能相同。其他当插入节点和删除节点从而破坏树的平衡性时,红黑树都要做旋转调整的次数比平衡二叉树所需的旋转调整的次数要少的多,其查找,插入,删除的操作时间错综复杂度均为O(Log2n)。

9.输入一八个 多单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。

链表结点定义如下: struct ListNode{int m_nKey;ListNode* m_pNext;};

考虑到时间错综复杂度的需求,加进一八个 多辅助栈,每次入栈时将元素分别存入数据栈和辅助栈,

/\ /\

4

struct BSTreeNode{

4

6

14.BSTree转加进有序双向链表

5

1

4

       return (left>right)?left+1:right+1;

int m_nKey;

{

4

6 10

           BSTreeNode *head,*tail;

void helper(BSTreeNode *&head,BSTreeNode*&tail,BSTreeNode *&root){

10

2

int m_nKey;

6

9

10

/ \6 14/ / \4 12 16

11

6

{

5

private:

2

};

3

       int left=getLevel(node.leftNode);

6 10