1
8
不。 开玩笑。我觉得它看起来很有效率。 为了可读性,我将枚举顺序值。
|
2
4
“简单”是一个意见问题。除了一些风格上的问题(特别是使用神奇的数字而不是命名常量),考虑到具体的描述“遍历树并打印其内容,提供顺序选择”,这是最简单的方法。 但是,通过分离这两个关注点,您可以获得更大的灵活性:遍历树,并对数据执行一些操作。您可能希望以各种方式分析和操作数据,并打印数据,最好不要为每个操作重复遍历逻辑。相反,您可以添加额外的模板参数,以允许任意组合的前、后或顺序操作,按照以下步骤进行:
|
3
3
这取决于您真正想用它做什么——也可能重构它以模板化顺序,或者分离三种遍历类型,您可能希望将其转换为内部迭代,允许任何东西访问树中的数据:
(您可能还需要const f&和f&versions,而不是简单的复制pass-by-value函数参数,它允许您传入可变的函数并产生结果;只要函数没有成员变量或构造函数,by-value就可以了) 或者您可以创建代表三个遍历的迭代器,允许您使用std::copy编写输出;但是,这将是更多的代码,并且不会仅仅为了这个目的而这样做。但是,创建迭代器将允许在不发生堆栈溢出的情况下处理大型树,因为您必须在每个节点中都有一个“父”指针,或者让迭代器维护一个访问节点的显式堆栈。 虽然函数本身变得非常简单:
使用迭代器并不能简化实现,无论是在loc方面,还是实际上能够跟踪正在发生的事情:
|
4
2
我们可以“重新排序循环”
但这更多的是让它变得有趣而不是简单。:-)但是,代码在这里重复两次,而不是三次。 为了避免“神奇数字”,您可以这样写:
|
5
1
我可能会这样做: 枚举TraversalOrder预订单、InOrder、PostOrder
每个函数都是尽可能简单的,如果在编译时知道需要哪个函数,就可以调用所需的直接遍历函数。 |
6
1
你可以移动
每两个
|
7
0
@你将处于一个功能专业化的角落,见 https://stackoverflow.com/search?q=function+partial+specialization 测试顺序不高效也不优雅,您应该将遍历二进制树委托给只做一项工作的模板类。(通过专门化)该模板类还应作为成员a binarytreenode*启动递归算法。 |
8
0
如果它不是一个平衡的二叉树,那么它可能容易发生堆栈溢出。迭代地编写它可以避免这种情况。然而,这可能不是你想要的,因为我怀疑这是一个递归的学术练习。如果这是一个真实的项目,您可能会被问到,当有效集和关联容器已经存在时,为什么要实现二叉树。 您可以这样重写函数,使其与单入口、单出口(尝试保持您的风格)一致:
一些人可能会发现这更好,但其他人不会(SESE由于异常处理在大多数项目中实际上无法实施)。 如果您真的想超越(仍然是为了学术目的),您可以实现树迭代器,它执行预先排序、顺序排序和后顺序遍历。这将在不使用递归的情况下遍历树,并允许您将树遍历详细信息与输出节点分离。这当然不是一个微不足道的任务,特别是在C++中,它没有语言水平相当于生成器/协同程序。 您还可以避免将幻数(0、1、2)用于顺序前遍历、顺序后遍历,而改用命名常量。 |
9
0
我把它写成三个独立的函数。这不是在编写代码方面的简化,而是在阅读和理解方面的简化。您不必每次都查看文档来记住
在不使用任何模板magick的情况下分离if开关还有一个可忽略的速度优势。保持简单。 |
danial · 如何在多个字符串的每个位置找到最频繁的字符 2 年前 |
Manny · 如何比较Perl中的字符串? 2 年前 |
Diret · 获取范围内每个数字的子倍数的算法 2 年前 |
Saif · 排序时python如何决定何时调用比较器? 2 年前 |