摘要:1.字符串2.链表3.树4.图5.递归6.排序7.位运算(以上是计算机强相关的知识)8.动态规划9.排列组合10.概率(以上是高中数学难点)
阅读全文
摘要:/// /// 求一棵二叉树中相距最远的两个节点之间的最大距离 /// public class BinaryTreeMaxLength { public static void Do() { //创建二叉树 Node head = CreateTree(); //显示 Console.WriteLine(LevelOrderTraversal(head)); int maxDistance = 0; G...
阅读全文
摘要:namespace ShopEx.CRS.Test{ /// ///将链表逆序 /// public class ReverseLinkList { //入口 public static void Do() { //创建单链表 int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; Node head = new Node() { Num = array[0] }; Node tmp = head;...
阅读全文
摘要:/// /// 找出二叉树中和为某一值的所有路径 /// class BinarySearch { public static void Do() { int[] tree = { 10,5,8,4,7,1}; ...
阅读全文
摘要:通过中序遍历可以得到一个有序的序列,不创建一个节点实现有序双向列表。 /// /// 二叉查找树变成有序的双向链表,不创建新的节点 /// public class BST2LinkList { public static void Convert() { Node[] tree = CreateBST(); Node head = null; MidddleOrderSearch(tree, 0, ref head); Console.Read();...
阅读全文
摘要:二叉查找树:如果左子树不为空,那么左子树上的所有节点都小于根节点; 如果右子树不为空,那么又子树上的所有节点都大于根节点; 左右子树也是二叉排序树。在后序遍历得到的序列中,最后一个数字是树的根节点的值。数组中前面的数字可以分为两部分:(1)第一部分是左子树结点的值,它们都比根结点的值小(2)第二部分是右子树结点的值,它们都比根结点的值大(3)递归左子树(4)递归右子树代码: public class BinarySearchTrees { //有序遍历结果的特点是,最后一个元素是根元素,根据这个根元素会把其他的子序列按照大小分成两个部分, ...
阅读全文
摘要:推荐使用堆排序,复杂度0(n*lgn)/// /// 利用堆排序选出数组的最小的k个元素 /// public class HeapSort { /// /// 大根堆排序 /// public static void Sort() { int[] array = { 1, 3, 7, 5, 2, 8, 4, 6, 10, 9 }; //创建大根堆,父节点都大于子节点 CreateHeap(array); ...
阅读全文
摘要:方案一:遍历所有子数组,复杂度o(n^3) public static int Max1() { int[] array = { 1, -2, 3, 10, -4, 7, 2, -5 }; int length = array.Length; int maximum = array[0]; int sum = 0; for (int i = 0; i maximum) maximum = sum; ...
阅读全文
摘要:两个字符串中字符是否包含的问题比如,如果是下面两个字符串:String 1: ABCDEFGHLMNOPQRSString 2: DCGSRQPO答案是true,所有在string2里的字母string1也都有。如果是下面两个字符串:String 1: ABCDEFGHLMNOPQRSString 2: DCGSRQPZ 答案是false,因为第二个字符串里的Z字母不在第一个字符串里。方案一:两个循环分别轮询,复杂度o(m*n)方案二:用快排法对两个字符串进行排序,然后遍历两个已排序的字符串,复杂度o(mlgm)+o(nlgn)+o(m+n) 遍历已经排序字符串的代码 public s...
阅读全文
摘要:二叉树的遍历,分为深度遍历和广度遍历,其中深度遍历又分为先序、中序和后序。 二叉树的遍历用递归实现,代码形式简单,但是递归借助程序建立起深度遍历的模型显得相对抽象,故而下面的代码会设计深度遍历的非递归实现。 程序运行结果: 先序遍历的结果是:1,2,4,8,9,5,10,11,3,6,7,先序遍历(
阅读全文
摘要:插入排序: 阐述: 在已排序集合中插入待排序集合中的某一元素,使得已排序集合仍然有序,直到待排序集合大小为1。 时间复杂度: 插入已排序集合的时间复杂度是O(N),遍历待排序集合的时间复杂度是O(N),所以插入排序的时间复杂度是O(N*N)。 稳定性 插入排序主要就是在挪动待排序集合的位置,并且将元
阅读全文
摘要:选择排序 阐述: 每一趟排序选择出待排集合中最小的值(假设从大到小排序)放置到已排序集合之后,直到待排集合的元素都排完。 复杂度: 遍历待排集合时间复杂度O(N),确定待排集合的首位置时间复杂度O(N),所以选排的时间复杂度是O(N*N) 稳定性: 选排在将最小值置换到已排集合之后时会把相同元素的相
阅读全文
摘要:冒泡排序 阐述: 通过比较相邻两个元素的值,将最小值(假设从小到大排序)置换到待排集合的首位,通俗说就是把最小值放到待排集合的前面。 冒排包括两个遍历,确定待排集合的首位置,遍历待排集合置换出最小值,所以时间复杂度是O(N*N)。 冒排的是两个相邻元素的位置交换,相邻操作很显然不会打乱相同元素的相对
阅读全文
摘要:阐述: 归并排序是将两个有序表合并成新的有序表; 而子序列的划分是递归地将待排序集合折半划分多个子序列,类似一个二叉树, 另外上面的递归操作大多会涉及分治思想,通俗讲就是各个分支上的子序列的有序,为最大的序列的有序埋下基础。 所以需要lgN趟的二路合并(假设集合的规模是N),每趟合并的复杂度是O(N
阅读全文