【问题标题】:Determining if a tree walk is breadth first, depth first, or neither确定树行走是广度优先、深度优先还是两者都不是
【发布时间】:2013-11-06 14:19:02
【问题描述】:

给定一棵树 T 和一系列节点 S,对 S 的唯一限制是它是通过某种类型的递归完成的——也就是说,如果一个节点的所有祖先都已经出现,一个节点只能出现在 S 中,什么是确定 S 是广度优先访问、深度优先访问还是两者都不是的好算法?

蛮力方法是计算每个广度优先和深度优先序列,看看是否有任何与 S 相同的方法。有更好的方法吗?

如果我们不想要“是”或“否”的答案,而是要衡量距离怎么办?


更新 1 距离测量,我的意思是访问可能不是精确的 BFS,但它很接近(一些编辑可能会使其成为一个);我希望能够订购它们并说 BFS

更新 2 当然,对每个 BFS 或 DFS 进行暴力枚举可以回答这个问题;我想要更高效的东西。

【问题讨论】:

  • 在广度优先遍历中,一个节点的所有直接子节点出现在任何后代之前。
  • 定义“距离测量”
  • 如果一个节点的任何祖先出现在它之前,那么它不是深度优先的,因为它是由出现在它之前的所有节点的孩子定义的(因此一个节点的所有祖先都出现在它之后) .

标签: algorithm search recursion tree


【解决方案1】:

你有树和序列,对吧?在这种情况下,很容易确定一个序列是否是广度优先搜索,以及它是否是深度优先。

先判断是否是广度:将节点分成L0,L1,...,Lk组,其中L0是0级节点的集合(只有一个根节点,所以它的大小为1),L2是 1 级节点的集合,以此类推。如果序列 S = (permutation(L0), permutation(1), ...) 则为广度优先搜索。

要检查它是否是深度优先:从指向序列中第一个节点和树的根节点的指针开始。他们应该是一样的。如果前一个节点有任何子节点,则序列的下一个元素必须是前一个节点的子节点。如果存在冲突,则它不是 DFS 序列。如果没有子节点,则下一个序列元素必须是前一个节点的父节点的子节点,......等等。这种方法并不像听起来那么复杂,并且可以在堆栈的帮助下轻松实现。

我不太确定您是否需要“测量距离”。但是正如你所看到的,这两种方法都可以返回冲突的数量。也许你可以用它来计算“距离”?

【讨论】:

  • ElKamina - 这可行,但效率不高。有没有比暴力破解更好的方法?
  • @SRobertJames 哪个部分是蛮力?广度优先检查是最坏情况 O(nlogn)。深度第一部分也是 O(nlogn)。线索:第一部分对每个级别的元素进行排序并进行二进制搜索。第二部分使用堆栈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2017-11-02
  • 2010-10-15
相关资源
最近更新 更多