\documentclass[实验报告模板]{subfiles}

\renewcommand{\mydate}{
    2023/11/10
}
\renewcommand{\mychapternum}{5}

\begin{document}
    \mytitle
    \begin{enumerate}
        \myitem{实验目的}{
            \item 使用第五章的知识解决树的综合问
            题。
        }
        \myitem{实验内容}{
            \item 用顺序表或链表形式实现一棵树，树中节点存放 2 个内容：整数编号，
            和字符串的文本。每个节点的编号，是整棵树自上而下，自左而右依次
            编号的。构造这棵树的方式：一行代表 1 个节点对应的儿子节点，第 1
            个数据是编号，后续字符串以空白字符分隔，依次作为该节点的儿子，
            并自动编号。如果新录入的编号，在已有树中不存在，则发出错误提
            示；如果新录入节点后，对原有的编号有影响，则更新原有编号，使满
            足编号自上而下、自左而右依次编号的规则。假设树根为 0 号节点，一
            开始就存在。（注：允许在节点上，增加层次字段，比如，0 号节点的
            层次为 1；1 号节点“张三”的层次为 2）\\
            输入案例：\\
            0\ 张三\ 李四\ 王五\qquad
            ：表示，3 个人都是 0 号节点的儿子\\
            2\ 师大\ 统计\ 计算机\qquad
            ：表示，3 个院系是李四儿子\\
            0\ 赵六\qquad
            ：表示，0 号节点下增加 1 个儿子，此时，
            2 号节点的儿子编号将需要更新
            \item 在第 1 题的基础上，将树转换成二叉树，遵循左孩子右兄弟的原则。
        }
        \myitem{实验原理}{
            \item 程序设计原理。
        }
        \myitem{实验步骤}{
            \item 问题抽象
            \item 编写程序
            \item 调试程序
            \item 完善总结
        }
        \myitem{调试过程、结果和分析}{
            \item VSCode调试很方便，但用了CLion后发现CLion调试的手感更好，仔细思考后发现可能原因之一是有时候CLion启动调试和重启调试更快，虽然可能只有一秒甚至不到一秒的时间，但在注意力高度集中找bug时不到一秒的间断也可能造成分心；
            \item 还有可能的原因是CLion的变量监视窗口可以步入步过时保持展开的层级；
            \item 而且CLion的自动补全更加完善，比如输入一个带参数的函数名会自动加好括号并将光标移动到括号内，输入一个无参数的函数名会自动加括号并将光标移动到括号右侧，删除左括号会自动删除相邻的右括号等等；
        }
        \myitem{总结}{
            \item 虽然C++的智能指针可以自动管理对象的生命周期，但也许在这种不需要长期维护，也不需要安全性的项目上使用原始指针更方便，只是要自己实现析构函数罢了；
            \item 为了简化代码便于从一个入口文件直接编译，直接使用了include cpp源文件的方法，可以从main.cpp入口直接编译；
            \item 将此题中的树转化成二叉树后，此题中的遍历方式不是先序中序后序层序中的任何一种，非常有创新点！
            \includegraphics[width=1em]{imgs/028E9BA6.pdf}
            受到广度优先搜索的启发，代码中采用了标准库中的队列实现，遍历每个节点时将它的左节点入队，每个节点出队时将它扩展到所有的右节点依次遍历；
            \item 虽然代码中也维护了线索化的标志域，不过好像没有用到线索化二叉树；
            \item 在命令行输出时要计算每个节点的宽度，防止子节点相互遮挡；
            \item 还能做的更好，但由于时间原因，就暂时这样了，以后可以完善一下，比如可以在命令行输出得更美观一些，使用多线程等。
        }
        \item \textbf{附件}
        
        \textbf{说明：}
        \begin{enumerate}
            \item 由于多叉树实现的复杂度太高，此题直接使用二叉树完成。
            \item 为了便于阅读，使用CodeGeeX生成了部分代码的注释，注释不一定正确或有用，仅供参考。
        \end{enumerate}
        \textbf{运行时截图：}\\
        \includegraphics[width=1\linewidth]{imgs/2023-11-12-21-09-15.png}
        \includegraphics[width=1\linewidth]{imgs/2023-11-12-21-09-45.png}
        \includegraphics[width=1\linewidth]{imgs/2023-11-12-21-10-00.png}
        \includegraphics[width=1\linewidth]{imgs/2023-11-12-21-10-48.png}
        \includegraphics[width=1\linewidth]{imgs/2023-11-12-21-11-06.png}
        \includegraphics[width=1\linewidth]{imgs/2023-11-12-21-11-36.png}
        \includegraphics[width=1\linewidth]{imgs/2023-11-12-21-11-50.png}
        \includegraphics[width=1\linewidth]{imgs/2023-11-12-21-12-13.png}
        \includegraphics[width=1\linewidth]{imgs/2023-11-12-21-12-26.png}
        \textbf{代码：}
        \begin{enumerate}
            \itemsep 5em
            \item bitree.cpp
            \inputminted[linenos=true, breaklines=true]{cpp}{../C++/第五章作业/bitree.cpp}
            \item view.cpp
            \inputminted[linenos=true, breaklines=true]{cpp}{../C++/第五章作业/view.cpp}
            \item main.cpp
            \inputminted[linenos=true, breaklines=true]{cpp}{../C++/第五章作业/main.cpp}
            \item CMakeLists.txt
            \inputminted[linenos=true, breaklines=true]{cmake}{../C++/第五章作业/CMakeLists.txt}
        \end{enumerate}
    \end{enumerate}
\end{document}