Algorithm 在固定时间内镜像二叉树

Algorithm 在固定时间内镜像二叉树,algorithm,tree,big-o,Algorithm,Tree,Big O,这不是一个家庭作业问题。我听说可以在固定时间内镜像二叉树,即翻转它。确实是这样吗?当然,根据您的数据结构,您只需执行以下操作:不是先遍历左节点,然后遍历右节点,而是先遍历右节点,然后遍历左节点。这可能是传递到遍历树的递归函数中的参数(即在C/C++中,一个bool bDoLeftFirst,以及一个使用该参数决定遍历中的子节点顺序的if语句)。您是指“反转二叉树”吗,Max Howell无法解决并因此被谷歌拒绝的问题 您可以在“讨论”部分找到解决方案。既然您遍历了整个树,这不是O(n)吗?OP

这不是一个家庭作业问题。我听说可以在固定时间内镜像二叉树,即翻转它。确实是这样吗?

当然,根据您的数据结构,您只需执行以下操作:不是先遍历左节点,然后遍历右节点,而是先遍历右节点,然后遍历左节点。这可能是传递到遍历树的递归函数中的参数(即在C/C++中,一个
bool bDoLeftFirst
,以及一个使用该参数决定遍历中的子节点顺序的if语句)。

您是指“反转二叉树”吗,Max Howell无法解决并因此被谷歌拒绝的问题


您可以在“讨论”部分找到解决方案。

既然您遍历了整个树,这不是O(n)吗?OP请求恒定时间它可能不是左/右节点,而是a/b节点,该参数将定义a是左还是右,因此是恒定的time@cricket_007-我认为关键是“镜像”与遍历是分开的。为了避免迂腐的参数,可以将which direction标志作为数据结构的一部分,定义子指针的角色。切换标志是O(1),因此O(1)重新定义子指针的角色。使左子指针成为左子指针的唯一原因是名称和使用方式-更改这些名称,并且没有理由不能在运行时更改角色,因为该标记也是数据结构的一部分。@Steve314-我同意重新分配指针是O(1),但不能只为根用户这样做,并且到此为止,对于每个非叶节点,您仍然需要这样做,因此我仍然认为它是O(n)。@cricket_007-仅此而已-除了一个标志,您不需要重新分配任何内容。指针保持不变,但它们扮演不同的角色,因为这是标志定义的。没有左子指针和右子指针,如果标志为true,则有左子指针,否则有右子指针,如果标志为true,则有右子指针,否则有左子指针。树的逻辑意义是镜像的,即使只有标志在内存中发生了更改-尽管在使用知道该标志的遍历函数进行遍历之前,您不会看到这一点。我的意思是反转,但没有讨论O(1)中的解决方案。@ayberkt我认为您无法在O(1)中做到这一点@ayberkt您必须迭代或递归地遍历至少一个子树,这至少需要O(h)个时间。