Algorithm 查找树中间附近的所有节点

Algorithm 查找树中间附近的所有节点,algorithm,data-structures,tree,Algorithm,Data Structures,Tree,我从朋友的访谈中得到了这个问题:给定一棵二叉树,从树中间附近的所有级别打印节点数组(最多两个节点)。下面是一个例子: 1 / \ 2 3 / \ \4 5 9 / 10 1/\2 3/\4 5 9/10 输出是[[2,3],[5,9],[10]我只能想到一种低效的方法:对树进行级别排序,对于每个级别,将当前级别中的所有节点放入一个数组,如果节点为NULL,则在插槽中放入一个标志(可能是-1或其他)。最后,打印出每个数组中间的所有节点。< BR/>对于

我从朋友的访谈中得到了这个问题:给定一棵二叉树,从树中间附近的所有级别打印节点数组(最多两个节点)。下面是一个例子:
1
/ \
2 3
/ \ \
4 5 9
/
10 1
/\
2 3
/\
4 5 9
/
10 输出是
[[2,3],[5,9],[10]

我只能想到一种低效的方法:对树进行级别排序,对于每个级别,将当前级别中的所有节点放入一个数组,如果节点为
NULL
,则在插槽中放入一个标志(可能是-1或其他)。最后,打印出每个数组中间的所有节点。< BR/>对于上述示例,我的代码将首先得到4个数组:
<代码> [1 ],[2,5],[4,5,1-9],[-1,-1,10,-1 ] < /代码>,在此过程中,打印出非-1的数组中的所有中间值。
我相信一定有更好的解决办法,有人能提供吗?谢谢

对于这个问题,我能想到的唯一方法是,从根开始,我们可以将节点分为两种类型:根的左侧和根的右侧。对于每个级别,对于左侧节点,我们找到最右侧的节点,对于右侧,我们找到最左侧的节点。希望这对你有帮助

在遍历树的所有元素之前,我们永远无法确定元素是否存在于第i个级别。因此,时间复杂度的优化永远不会比O(n)更好,O(n)与您提出的算法相同

解决方案中唯一的问题是,对于每个级别,都需要维护一个单独的阵列。虽然空间复杂度在渐近上保持不变,但在绝对数中,它变成了额外的使用

您可以执行以下操作:

  • 执行水平顺序遍历
  • 对于每个元素,当您将其推送到队列时(对于级别顺序遍历),还要保持元素与中间的偏差。根的偏差为0。根的左子级将具有-1。而正确的子项将是+1
  • 对于每个级别,您都需要保留一个“全局”元素,说明元素与中间的距离。对于给定级别,最多只能有2个元素
  • 在每一个关卡上都要继续这样做 该算法在稀疏树的空间复杂度方面效果更好


    希望这有帮助

    按顺序遍历树并保持节点的级别

    节点:4-2-5-1-3-10-9

    级别:2-1-2-0-1-3-2

    现在对于级别输出,我们从级别0开始,找到左侧第一个出现的1--对应的数字是2,找到右侧第一个出现的1--对应的数字是3,因此级别1输出是

    对2级输出执行相同的操作是

    对于3级,输出仅为

    时间复杂度O(n) 空间复杂度O(n)


    与级别顺序遍历解决方案相同

    让我问一下,如果节点10是9的正确子节点,那么第4行的答案仍然是10吗?因为我不明白为什么必须将-1放入数组中。@WorakarnIsaratham很抱歉我犯了一个错误,如果10是9的正确子代,它应该仍然是[[2,3],[5,9],[10]]。我放-1的原因只是为了标记空节点,我可以放*或任何其他东西来标记时间。你是对的,我把它分成两部分,然后对每个子树进行水平排序,但是,我认为如果是这样,时间复杂度将是相同的,空间复杂度可能会提高。明白了,很好的解决方案!谢谢