在学校,当我们需要遍历树(例如二叉搜索树)时,我们总是被教导以递归方式遍历树。
由于每次重复都可以写成迭代,是否可以单独使用迭代来访问树的元素?
我在C ++的上下文中问这个问题
答案 0 :(得分:3)
是
对于您处理的每个节点,将子项存储到队列中。对于同一级别中的其余节点,这种情况继续存在。处理该级别中的所有节点后,您将处理排队的子节点。反过来,您将孩子的孩子存储到队列中。这种情况一直持续到你触底。
例如以下内容:
D
B F
A C E G
// 1
Current: D
Queue: B, F
// 2
Current: B, F
Queue: A, C, E, G
// 3
Current: A, C, E, G
Queue: no more!
迭代比递归复杂得多,因为你需要实现一个队列(如果没有提供)以及一些非平衡树的附加逻辑。但是,迭代更“内存友好”,因为你的队列只是一堆指向节点的指针,而递归会在每次调用时占用堆栈。
答案 1 :(得分:0)
是。存在一种名为threading的树的方法,它基本上以特定的遍历顺序连接节点。因此,您可以迭代遍历整个树,就像任何其他递归遍历一样。
答案 2 :(得分:0)
答案是肯定的。
这取决于你想要做什么样的遍历(预购,有序,后序)。如果要复制递归行为,则需要模拟堆栈递归。 它可能在一些场景中很有用,但递归更简单。
答案 3 :(得分:0)
std::set
和std::map
最常见的实现是红黑树;两者都可以只用两个迭代器迭代(通过调用begin
和end
获得);因此,不仅可以在没有递归的情况下进行迭代,甚至可以在O(1)空间中进行迭代,只要树的结构正确。
树有多种表示形式:
一般来说,如果:
然后你可以在O(1)空间中实现迭代;你甚至可能选择在孩子之前,中间或之后“拜访”父母。