繁体   English   中英

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

[英]Find all nodes near the middle of the tree

我从朋友的访谈中得到了这个问题:给定一棵二叉树,从树中间附近的所有级别打印节点数组(最多两个节点)。 这是一个例子:

1
/ \
2 3
/ \ \
4 5 9
/
10
输出为[ [2,3], [5,9], [10] ]
我只能想到一种低效的方法:对树进行级别排序,对于每个级别,将当前级别中的所有节点放入数组中,如果节点为NULL ,则将一个标志(可能为-1或其他)放入插槽。 最后,打印出每个阵列中间的所有节点。
对于上面的示例,我的代码将首先获得4个数组:
[1], [2,3], [4,5,-1,9],[-1,-1,10,-1]之后,打印出数组中不是-的所有中间值1。
我相信必须存在更好的解决方案,任何人都可以提供? 谢谢!

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

按顺序遍历树并保持节点的水平

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

等级:2-1-2-0-1-3-2

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

对2级输出执行相同的操作是<5,9>

对于第3级输出仅为<10>

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

与级别订单遍历解决方案相同

在遍历树的所有元素之前,我们永远无法确定元素是否在第ith级存在。 因此,时间复杂度永远无法比O(n)最佳,这与您提出的算法相同。

解决方案中的唯一问题是,对于每个级别,都需要维护一个单独的阵列。 尽管渐近地空间复杂度保持不变,但以绝对数字表示,它变得多余了。

您可以执行以下操作:

  1. 进行级别顺序遍历。
  2. 对于将每个元素推送到队列中(用于级别顺序遍历)时,还请保持元素与中间元素的偏差。 根的偏差为0。根的左子节点的偏差为-1。 而合适的孩子将为+1。
  3. 对于每个级别,您都需要保留一个“全局”元素,以了解元素与中间的接近程度。 对于给定的级别,最多只能有2个元素。
  4. 继续每个级别的操作。

对于稀疏树,此算法明智地在空间复杂度方面更好地工作。

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM