这两周学了不少查找方面的知识,查找是一个很重要的学习板块,查找分为线性表查找,树表查找,哈希表查找等,顺序表查找包括顺序查找,折半查找,索引存储结构和分块查找,其中索引存储结构和分块查找的执行效率高,普遍用于搜素引擎,字典就是分块查找的应用。树表查找分为二叉排序树,平衡二叉树,B-树和B+树,二叉排序树的操做较多,须要重点掌握。哈希查找是执行效率高的查找。哈希冲突的解决方法有开放地址法和拉链法。
BinTree Insert( BinTree BST, ElementType X ) { if(!BST){ 若是是空树创建节点 } 根据数据大小创建左右节点 } BinTree Delete( BinTree BST, ElementType X ) { if(BST==NULL) { printf("Not Found\n"); } else { 比较字符大小,不断查找节点 找到节点时,经过课本上讲的方法,删除节点并用合适的节点代替该节点的位置 } return BST; } Position Find( BinTree BST, ElementType X ) { if(BST==NULL) return NULL; X比节点数据大,则遍历右孩子 X比节点数据小,则遍历左孩子 X和节点数据相同则return该结点 } Position FindMin( BinTree BST ) { if(BST){ 不断地找左孩子直到没有左孩子 } } Position FindMax( BinTree BST ) { if(BST) { 不断地找右孩子直到没有右孩子 } }
Q1:本题在一开始设计得时候一直出现段错误。 A1:查找结果的过程当中发现,本题缺少对节点是否为空的判断,致使出现段错误。 Q2:以后调试,有一些答案错误。 A2:答案错误的缘由是在建树的时候我犯了低级错误,使用可两个Right。
bool IsBST ( BinTree T ) { 遍历节点,当节点为空时二叉树为空 对节点进行判断,若是左子树的子节点大于根节点或者右子树的子节点大于根节点,则非二叉搜索树 利用递归层层遍历子节点,若是出现左孩子大于根或者右孩子小于根,则不是二叉搜索树。 }
Q1:本题出现多种答案错误。 A1:调试了好几回,检查了好几回,发现代码没有明显错误,从新阅读题目,发觉审题出现错误,搜索二叉树的左节点的孩子所有要比根节点小,右孩子的孩子所有要比根节点大,新添加一段代码,得出正确答案
int Find(Tree T,int x) { 判断是否有节点存在 } int LCA( Tree T, int u, int v ) { 树为空或找不到目标节点,返回error 根据搜索树的规律,祖先节点的数据的大小必然在两个节点之间,同时最早出现的那个为祖先节点。 }
Q1:本道题理解起来比较困难,寻找共同且最近的祖先节点是什么意思。我一开始想不到设计思路 A1:参考网上的代码,其实题目没有那么难,本题为二叉搜索树,祖先节点的大小一定在两个查找数据以内,只要先确认查找 的数据是否存在,再和根节点进行比较,最后得出答案。
编写一个函数来查找字符串数组中的最长公共前缀。 若是不存在公共前缀,返回空字符串 ""。 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: 输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀。 说明: 全部输入只包含小写字母 a-z 。
找到最短字符串,以它的长度为基准,从全部字符串的第一个字符开始对比,若都同样,ans加上该字符,若不同,返回答案;数组
本道题涉及stl容器,在解决时可用多种方法,本题应用得解题方法时间复杂度为O(n的平方),能够解题,在string容器方面的使用值得学习。string min=str[0]这一步写的好,为求最短的串,把二维数组化为一维数组。本题在执行方面,先求出最短串的长度,无形中避免了许多没必要要的操做,增长了执行效率。以后进行比较,一有不匹配的就跳出循环。函数