剑指Offer--联通研究院笔.面试题 1.二叉树适宜存储什么样的数据? 树最适合用来表示( C ). A.有序数据元素 B.无序数据元素 C.元素之间具有分支层次关系的数据 D.元素之间无联系的数据 2.数据库中多表查询.增加数据字段值: 3.进程的定义.主要特征.最基本的特征:   进程是指在系统中能独立运行并作为资源分配的基本单位,是由一组机器指令.数据和堆栈组成的,是一个能独立运行的活动实体.  基本特征: 动态性:动态产生.动态消亡: 并发性:同其它进程并发执行: 独立性:独立运行的活…
题目:输入一个字符串,打印出该字符串的全排列. 思路:将整个字符串分成两部分,第一部分为一个字符,将该字符和该字符后面的字符(直到最后一个字符)依次交换,确定第一个字符:然后固定第一个字符,将后面的字符也按照这种思维递归,即可完成整个字符串的排列. 如图所示: Java代码: public class StringPermutation { public void permutation(char[] s){ if(s==null) return; permutation(s,0); } pub…
题目:输入一个二叉收索树,将二叉搜索树转换成排序的双向链表.要求不能创建节点,只能将链表中的指针进行改变. 将复杂的问题简单化:思路:二叉收索树,本身是一个排序结构,中序遍历二叉收索树就可以得到一组排序数.如下图4.12所示.如何转换且看图4.13.将二叉搜索树变成三个部分,将左子树转换为二叉排序树,与根节点相连,右子树也转换为二叉排序树与根节点相连即可完成整个转换. Java代码: public class ConvertBinarySearchTree { public class Bina…
题目:请写一个函数clone(ComplexListNode pHead),实现复杂链表的复制. 复杂链表的数据结构如下:public class ComplexListNode{int m_nValue;ComplexListNode m_pNext;ComplexListNode m_pSliping//指向链表中的任何一个节点} 例如:m_pSliping指向NUll的,并没有画出来. 将复杂的问题简单化,各个击破: 思路:第一步,就是复制节点,并连接到原始节点的后面,第二步,设置复制出来…
二叉搜索树:二叉搜索树根节点的左边都比根节点小,右边都比根节点大. 例题:输入一个数组,判断是否为二叉搜索树的后序遍历序列,如果是,返回true,如果不是,返回flase,假设没有重复的元素. 思路:由于是后序遍历,所以数组的最后一个节点是根节点,而且,由于是二叉收索树,所以,前面的数据被分为两部分,右边部分比根节点小,左边比根节点大.左右两边又分别为二叉收索树,因此可以用递归来实现. Java代码: public class IsBinarySearchTree { public boolea…
题目:从上往下打印二叉树的每一个节点,同一层的节点按照从左到右的顺序打印 思路:这是一个层序遍历的问题,因此要借用到队列.我们可以在打印第一个节点的同时将这个节点的左右子节点都放入队列,同样打印左右子树. 抽象的问题具体化: C++代码: #include<iostream> #include<deque> using namespace std; struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; Bina…
题目:输入两个整数序列,第一个序列表示栈的压入序列,请判断第二个序列是否为弹出序列. 思路:定义两个指针sPush和sPop分别指向两个整数序列的开头,借助一个辅助的栈,将第一个序列的数据依次压入栈中,直到压入栈中的数据和第二个栈中sPop所指向的数据相等,就将这个数据弹出栈.sPop指向下一个数字.重复上述过程.直到sPop等于序列的长度并且栈为空. 将抽象的问题具体化的过程如下: C++代码: #include<iostream> #include<stack> bool is…
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min,push及pop的时间复杂度都是O(1) 思路:定义两个栈分别为dataStack和minStack,dataStack用来存放要放入栈中的数据,而minStack用来存放dataStack中的对应时刻的最小值. 抽象问题具体化:如下图所示: C++代码: #include <stack> #include <assert.h> #include <stddef.h> t…
题目:输入一个矩阵,按照从外向里的顺序依次打印出每一个数.(画图让抽象的问题形象化) 思路:打印矩阵时,把每一层当做一个圈来打印,找到打印整个矩阵的截止条件. 从上图中我可以看到一个6*6的矩阵(长宽分别为cloums,rows)最后一圈的最左边的顶点上面的坐标为(2,2),我们同时发现在一个5*5的矩阵中最后一圈的最左边的顶点的坐标也为(2,2),并且这个顶点的坐标的横坐标和纵坐标是相同的暂且设置为(start,start),因此我们可以得到截止条件即为,cloums>startX*2,row…