\documentclass[实验报告模板]{subfiles} \renewcommand{\mydate}{ 2023/12/15 } \renewcommand{\mychapternum}{7} \begin{document} \mytitle \begin{enumerate} \myitem{实验目的}{ \item 使用第七章的知识解决查找树的综 合问题。 } \myitem{实验内容}{ \item 给出 N 个正整数作为二叉排序树的节点插入顺序.判断这串序列是否是 该二叉树的先序序列或者是该二叉排序树的镜像树的先序序列.镜像树 指的是交换根结点的左右子树形成的二叉树,如果对于输入的序列与二 叉排序树的先序序列一致,则输出 Yes,并输出该二叉排序树的后序序 列.若对于输入的序列与二叉排序树的镜像树的先序序列一致,则输出 Yes,并输出该二叉排序树的后序序列.其余情况输出 No. \item 根据二叉排序树的镜像树的后序遍历序列作为顺序,构造平衡二叉树。 } \myitem{实验原理}{ \item 程序设计原理。 } \myitem{实验步骤}{ \item 问题抽象 \item 编写程序 \item 调试程序 \item 完善总结 } \myitem{调试过程、结果和分析}{ \item 树的结构确实不好调试,尤其是平衡二叉树,但好在可以进行中序遍历,正确的情况下中序遍历的结果应该是排好序的; \item 对于镜像树,可以修改比较操作的函数定义,就像C++内置的make\_heap一样,当然由于镜像树是对称的,可以直接在遍历时先遍历右子树,再遍历左子树,也能实现; \item 两道题的输入输出有关联性,第二题的输入是第一题的输出但又不完全是,第一题输出的是原二叉树的后序遍历结果,但第二题要使用第一题的镜像数的后序遍历结果,因此可以使用文件记录输出结果,第二题就可以进行输入重定向。 } \myitem{总结}{ \item 遵循指针应在初始化时分配资源,以及将资源交给变量作用域和变量生命周期自动管理,此次代码中将每个节点的左右指针都使用unique\_ptr定义,这样就不需要自己进行delete删除分配的资源了; \item 但是使用unique\_ptr要注意,此指针指向的对象不能再被其他对象指向,因此需要使用move进行转移资源的所有权,这在旋转子树时尤其明显; \item 借助std::function和匿名函数,我们可以很方便地实现简单的函数回调,尤其是涉及到类和对象的成员函数的时候; \item 类中的this是常量指针,是不能改变它所指向的地址的,即不能对*this赋值; \item C++中有类似Python的迭代器,也能用匿名函数实现类似JavaScript的回调; \item 但是C++中没法直接使用 this->left\_child \&\& this->left\_child->postorder\_traversal(output),因为逻辑与操作中的函数调用会返回void,而void无法转换为bool类型; \item C++中的模板自动类型推断,还有解包参数,和Python、JavaScript中有相似之处,但又不完全一样,仍需深入了解。 } \myitem{附件}{ \itemsep 5em \item 第七章作业1.cpp \inputminted[]{cpp}{../C++/第七章作业/第七章作业1.cpp} \item 第七章作业2.cpp \inputminted[]{cpp}{../C++/第七章作业/第七章作业2.cpp} \item CMakeLists.txt \inputminted[]{cmake}{../C++/第七章作业/CMakeLists.txt} } \end{enumerate} \end{document}