DS博客作业--07查找

目录

1.本周学习总结(0--2分)

1.思维导图

2.谈谈你对查找运算的认识及学习体会。

  1. 查找一章所学习的算法方法比较多,刚开始做课堂派时理解了,但现在上完后,各种算法放在一起就会混乱,然后就不懂,就得翻书看看了。还有就是关于它的算法我理解了之后吧,不看书写代码又写不出来。但是我觉得这章画图之类的挺好玩的。不过在画图还是需要仔细小心,会容易出错。

2.PTA实验作业(6分)

  1. 本周要求挑3道题目写设计思路、调试过程。设计思路用伪代码描述。题目选做要求:
  2. 原则上题目选择越难,代码量越大分值越高。

2.1.题目1:6-1 二叉搜索树的操作集 (30 分)

  1. 本题要求实现给定二叉搜索树的5种常用操作。
  2. 函数接口定义:
  3. BinTree Insert( BinTree BST, ElementType X );
  4. BinTree Delete( BinTree BST, ElementType X );
  5. Position Find( BinTree BST, ElementType X );
  6. Position FindMin( BinTree BST );
  7. Position FindMax( BinTree BST );
  8. 其中BinTree结构定义如下:
  9. typedef struct TNode *Position;
  10. typedef Position BinTree;
  11. struct TNode{
  12. ElementType Data;
  13. BinTree Left;
  14. BinTree Right;
  15. };
  16. 函数InsertX插入二叉搜索树BST并返回结果树的根结点指针;
  17. 函数DeleteX从二叉搜索树BST中删除,并返回结果树的根结点指针;如果X不在树中,则打印一行Not Found并返回原树的根结点指针;
  18. 函数Find在二叉搜索树BST中找到X,返回该结点的指针;如果找不到则返回空指针;
  19. 函数FindMin返回二叉搜索树BST中最小元结点的指针;
  20. 函数FindMax返回二叉搜索树BST中最大元结点的指针。

2.1.1设计思路(伪代码)

  1. 伪代码尽量文字描述,请用下面markdown符号渲染。如:
  2. 定义变量i表示XXXXX
  3. for i=0 to n-1
  4. a[i]执行运算等等。
  5. end for
  6. ** 设计思路、伪代码要用```符号渲染 **
  1. BinTree Insert( BinTree BST, ElementType X )
  2. {
  3. if(BST==NULL) //判断树是否空;
  4. {
  5. BST= (BinTree )malloc(sizeof (BinTree)); //若树空,创建一个新结点,且树根为X,左右孩子为空;
  6. }
  7. else if(X<BST->Data) //X小于根结点;
  8. {
  9. //递归,在左子树中找插入位置;
  10. }
  11. else //X大于根结点;
  12. {
  13. //递归,在右子树中找插入位置;
  14. }
  15. return BST; //返回根结点;
  16. }
  17. BinTree Delete( BinTree BST, ElementType X )
  18. {
  19. if(BST==NULL) //空树删除失败,输出Not Found;
  20. {
  21. printf("Not Found\n");
  22. return 0;
  23. }
  24. else
  25. {
  26. if(X==BST->Data ) //找到要删除的结点;
  27. {
  28. BinTree p; //申请新结点;
  29. if(BST->Right ==NULL) //该树只有左孩子,无右孩子;
  30. {
  31. p=BST; //把树赋给p;
  32. BST=BST->Left ; //把树的左孩子赋给树;
  33. free(p); //释放(删除)根结点;
  34. }
  35. else if(BST->Left ==NULL) //该树只有右孩子,无左孩子;
  36. {
  37. //把树赋给p;
  38. //把树的右孩子赋给树;
  39. //释放(删除)根结点;
  40. }
  41. else //该有左右孩子;
  42. {
  43. BinTree r; //申请新结点;
  44. r= FindMax(BST->Left); //调用FindMax()函数,找出左子树中最大结点数,并赋给r;
  45. BST->Data = r->Data; //把树r的根赋给BST;
  46. BST->Left = Delete(BST->Left, r->Data); //调用删除函数Delete();
  47. }
  48. return BST; //返回树结点;
  49. }
  50. else if(X<BST->Data ) //X比树根结点小;
  51. {
  52. BST->Left = Delete(BST->Left ,X); //递归在左子树中删除为X的结点;
  53. }
  54. else
  55. {
  56. //递归在右子树中删除为X的结点;
  57. }
  58. }
  59. }
  60. Position Find( BinTree BST, ElementType X )
  61. {
  62. if(BST==NULL||BST->Data ==X) //树BST空或找到X;返回BST;
  63. {
  64. return BST;
  65. }
  66. if(X<BST->Data ) //X比根结点小;
  67. {
  68. return Find(BST->Left ,X); //在左子树中递归查找;
  69. }
  70. else
  71. {
  72. //在左子树中递归查找;
  73. }
  74. }
  75. Position FindMin( BinTree BST )
  76. {
  77. if(BST!=NULL) //判断树是否空;
  78. {
  79. while(BST->Left !=NULL) //最小结点在根结点的最左下结点;
  80. {
  81. BST=BST->Left ; //把树的左子树赋给树BST;
  82. }
  83. }
  84. return BST; //返回BST;
  85. }
  86. Position FindMax( BinTree BST )
  87. {
  88. if(BST!=NULL) //判断树是否空;
  89. {
  90. while(BST->Right !=NULL) //最大结点在根结点的最右下结点;
  91. {
  92. }
  93. }
  94. return BST; //返回BST;
  95. }

2.1.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)









2.1.3本题PTA提交列表说明。

  1. PTA提交列表中的每个错误详细说明为什么及如何解决。

  • Q1:编译错误
  • A1:应该把Delete()函数的最后弄成递归口,而不应该直接return.
  • Q2:答案错误
  • A2:在查找最大最小时的树的变化,比根大在右子树,比根小在左子树。

2.2 题目2:6-2 是否二叉搜索树 (25 分)

  1. 函数IsBST须判断给定的T是否二叉搜索树,即满足如下定义的二叉树:
  2. 定义:一个二叉搜索树是一棵二叉树,它可以为空。如果不为空,它将满足以下性质:
  3. 非空左子树的所有键值小于其根结点的键值。
  4. 非空右子树的所有键值大于其根结点的键值。
  5. 左、右子树都是二叉搜索树。
  6. 如果T是二叉搜索树,则函数返回true,否则返回false

2.2.1设计思路(伪代码)

  1. int a[100]; 定义一个数组ai并初值为0;
  2. int i = 0;
  3. bool IsBST()
  4. {
  5. if(树是否空)
  6. {
  7. 调用IsBST()函数,用左子树递归;
  8. 把树根结点的值赋给数组a;
  9. 调用IsBST()函数,用右子树递归;
  10. }
  11. for( 一层循环)
  12. {
  13. if(比较a[j-1]和 a[j]的大小关系)
  14. {
  15. 如果a[j-1]大于等于a[j],返回false;
  16. }
  17. }
  18. 返回true;
  19. }

2.2.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)

2.2.3本题PTA提交列表说明。

  1. PTA提交列表中的每个错误详细说明为什么及如何解决。

  • Q1:编译错误。
  • A1:在if判断树是否空里面对左子树和右子树的语法使用的不清晰,增加了没有必要的语句。

2.3 题目3:6-3 二叉搜索树中的最近公共祖先 (25 分)

  1. 在一棵树T中两个结点uv的最近公共祖先(LCA),是树中以uv为其后代的深度最大的那个结点。现给定某二叉搜索树(BST)中任意两个结点,要求你找出它们的最近公共祖先。
  2. 函数接口定义:
  3. int LCA( Tree T, int u, int v );
  4. 其中Tree的定义如下:
  5. typedef struct TreeNode *Tree;
  6. struct TreeNode {
  7. int Key;
  8. Tree Left;
  9. Tree Right;
  10. };
  11. 函数LCA须返回树T中两个结点uv的最近公共祖先结点的键值。若uv不在树中,则应返回ERROR

2.3.1设计思路(伪代码)

  1. int FindKey( )
  2. {
  3. if(树空)
  4. 返回ERROR;
  5. if(T->Key等于u)
  6. {
  7. 返回1
  8. }
  9. if(T->Key大于u)
  10. {
  11. 返回FindKey(T->Left, u ) ,在左子树中找;
  12. }
  13. else(T->Key小于u)
  14. {
  15. 返回FindKey(T->Right, u ) ,在右子树中找;
  16. }
  17. }
  18. int LCA( )
  19. {
  20. if(树空)
  21. 返回ERROR;
  22. if(FindKey( T, u)&&FindKey( T, v)) //调用FindKey( )函数;
  23. {
  24. if(T->Key大于uT->Key小于vT->Key大于v&&T->Key小于u)
  25. 返回 T->Key;
  26. else if(T->Key等于uT->Key等于v)
  27. 返回 T->Key;
  28. else if(T->Key大于uT->Key大于v)
  29. 返回 LCA( T->Left, u, v ); //调用LCA()函数,用左子树,u,v做参数;
  30. else
  31. return LCA( T->Right, u, v ); //调用LCA()函数,用右子树,u,v做参数;
  32. }
  33. else
  34. {
  35. 返回 ERROR;
  36. }
  37. }

2.3.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)

2.3.3本题PTA提交列表说明。

  1. PTA提交列表中的每个错误详细说明为什么及如何解决。

  • Q1:答案错误
  • A1:在比较时,各种情况考虑不周全,缺少一种情况运行都是错误的。
  • Q2:部分正确
  • A2:T-key在和u,v比较时,比较的条件设的不理想,因为情况很多,不够仔细,条件就错误了。

3、阅读代码(-2--2分)

找一份和查找运算相关代码,谈谈你对这个代码认识体会。

考研题种关于查找、二叉搜索树内容。

ACM、PTA天梯赛、leecode面试刷题网站,找查找相关题目阅读分析。

请按照下面内容填写代码阅读内容。请未必认真完成,如果发现应付,没有介绍代码思路、体会等扣分。

3.1 题目:二叉树展开为链

  • 介绍代码解决问题
  1. 给定一个二叉树,原地将它展开为链表。
  2. 例如,给定二叉树
  3. 1
  4. / \
  5. 2 5
  6. / \ \
  7. 3 4 6
  8. 将其展开为:
  9. 1
  10. \
  11. 2
  12. \
  13. 3
  14. \
  15. 4
  16. \
  17. 5
  18. \
  19. 6

3.2 解题思路

  1. 运用后序遍历和递归方法,递归返回值为当前节点的最后一个节点,然后再把返回的最后一个节点指向当前的右节点,当前的右节点指向左节点,置空左节点即可。 需特别注意没有处理空root的情况,所以进入函数时需要if(!root) return; recursive(root);

3.3 代码截图

3.4 学习体会

  1. NULLCC++中不等价,在C中习惯将NULL定义为void *指针值0,也可以定义为整型常数0。但在C++中,NULL被明确定义为整型常数0.如果C++还是使用使用void *的隐形式类型转换,则可能会带来语义二义性问题。nullptr初始化对象,能避免0指针的二义性问题。注意不能将nullptr赋给整型。

DS博客作业--07查找的更多相关文章

  1. DS博客作业07—查找

    1.本周学习总结 1.1思维导图 1.2学习体会 本章学习了顺序表.树表.哈希表的查找方式,学会计算各种查找方式下的ASL 树表部分的b树和平衡二叉树较为复杂,哈希表相对容易掌握 期末要复习的有点多, ...

  2. DS博客作业07——查找

    1.本周学习总结 1.1思维导图 1.2.谈谈你对查找运算的认识及学习体会. 查找的内容和前两章树和图相比,要简单许多,在二次搜索树虽然也要用到树,但是也是很简单的树的操作,再加上查找的代码可以使用m ...

  3. DS博客作业——树

    DS博客作业--树 1.本周学习总结 1.思维导图 2.谈谈你对树结构的认识及学习体会. 在树这一章节,我们学习的是二叉树的算法. 树的构建:一种是直接给树的顺序存储结构的字符串,一种是通过先序遍历和 ...

  4. DS博客作业05--查找

    这个作业属于哪个班级 数据结构--网络2011/2012 这个作业的地址 DS博客作业05--查找 这个作业的目标 学习查找的相关结构 姓名 黄静 目录 0.PTA得分截图 1.本周学习总结 1.1 ...

  5. DS博客作业04--图

    这个作业属于哪个班级 数据结构--网络2011/2012 这个作业的地址 DS博客作业04--图 这个作业的目标 学习图结构设计及相关算法 姓名 黄静 目录 0.PTA得分截图 1.本周学习总结 1. ...

  6. DS博客作业03--树

    这个作业属于哪个班级 数据结构--网络2011/2012 这个作业的地址 DS博客作业03--树 这个作业的目标 学习树结构设计及运算操作 姓名 黄静 目录 0. PTA得分截图 1. 本周学习总结 ...

  7. DS博客作业08--课程总结

    DS博客作业08--课程总结 1.当初你是如何做出选择计算机专业的决定的? 1.1 经过一年学习,你的看法改变了么,为什么? 1.2 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗? 为什么? 1. ...

  8. DS博客作业--课程总结

    1.当初你是如何做出选择计算机专业的决定的? 经过一年学习,你的看法改变了么,为什么? 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗? 为什么? 刚开始填报志愿的时候,因为我个人是没有什么比较特别 ...

  9. DS博客作业01--线性表

    1.本周学习总结(0--2分) 1.1思维导图 1.2.谈谈你对线性表的认识及学习体会. 1.线性表的内容上了三星期的课,相对来说内容比较丰富,尤其是链表方面,包含单链表,双链表和循环链表.作为第一部 ...

随机推荐

  1. 彻底解决eslint与webstorm针对vue的script标签缩进处理方式冲突问题

    彻底解决eslint与webstorm针对vue的script标签缩进处理方式冲突问题 2018年12月08日 21:58:26 Kevin395 阅读数 1753   背景不多介绍了,直接上代码. ...

  2. chrome扩展开发实战入门之一-hellocrx

    后记:在写这篇文章时,我还没搞懂chrome扩展的基本原理.后来才明白,最简单(且实用)的扩展只需要manifest.json和content_scripts.js两个文件,无需background. ...

  3. Poj 2976 Dropping tests(01分数规划 牛顿迭代)

    Dropping tests Time Limit: 1000MS Memory Limit: 65536K Description In a certain course, you take n t ...

  4. CodeForces - 999C Alphabetic Removals

    C - Alphabetic Removals ≤k≤n≤4⋅105) - the length of the string and the number of letters Polycarp wi ...

  5. 1937:【06NOIP普及组】数列

    woc 太捞了简直捞的一匹 我居然会写博客 反正呀没有人看 随便写写喽

  6. CentOS7根目录磁盘扩容(/dev/mapper/centos-root 空间不足)

    今天在给测试环境搭建k8s系统时,发现master根目录磁盘空间不足,需要扩容,记录如下. # 查看根分区大小 [root@master ~]# df -h Filesystem Size Used ...

  7. tomcat发布web项目

    转:https://www.cnblogs.com/skyblue-li/p/7888951.html Tomcat是一种Web服务器,我们自己做好了一个Web项目,就可以通过Tomcat来发布.服务 ...

  8. php中_initialize()函数与 __construct()函数的区别说明

    _initialize()方法是在任何方法执行之前,都要执行的,当然也包括 __construct构造函数. 也就是说如果存在_initialize()函数,调用对象的任何方法都会导致_initial ...

  9. [js]vue小结

    vue基础 - vue是一个渐进式框架 vue (视图渲染) components(路由机制) vue-router(路由管理) vuex (状态管理) vuecli (构建工具) - 库和框架 库如 ...

  10. kotlin 委托类的初始化函数

    import java.beans.AppletInitializer import kotlin.reflect.KProperty fun main(arg: Array<String> ...