给定2个N-ary树,可以比预订字符串比较更好,更有效地表明一棵树是另一棵树的子树?

时间:2017-04-24 06:28:12

标签: typescript tree traversal preorder

在一个问题中,我得到了2个二叉树,并且为了检查一个二叉树是否是另一个树的子树,代码片段基本上在烦扰的树上进行预先遍历并生成相应的字符串。然后它使用indexOf检查一个树字符串是否在另一个树中,以证明一棵树是另一棵树的子树。 现在问题说,因为字符串的生成和比较是昂贵的,除了执行字符串比较之外,我如何将其更改为n-ary树。

我不确定如何处理这个问题,但我有一个想法,我认为我可能会使用某种类型的HashMap将树节点存储为键,将子节点存储为值。那么也许比较相似键上的两个树值来检查树是否是一个子树?

但是那个怎么样?我糊涂了!需要一些帮助。

这里是功能片段:

//make the Node
interface Node {
  value: string ;
  left?: Node ;
  right?: Node ;
}
function checkSubtree(T1: Node , T2: Node ): boolean {
  return PreOrderTraversal(T1).indexOf(PreOrderTraversal(T2)) > - 1 ;
}
function stringFromPreOrder(tree: Node ): string {
  if (!tree) {
    return "" ;
}
  return tree.value + PreOrderTraversal(tree.left) + PreOrderTraversal(tree.right);

所以基本上给出了这个,如何让它更好地用于nary树而不是连接字符串并比较它们? 另外,对于nary tree,我知道孩子们会在一个数组中,我会预先对它进行预订,而不是左右。但是,我怎么能避免字符串连接,因为它昂贵?

1 个答案:

答案 0 :(得分:0)

参考:https://leetcode.com/articles/introduction-to-n-ary-trees/

您可以将n-ary转换为二叉树,反之亦然。

我们已经有了一个算法来查找二叉树的子树。 请参阅:https://www.geeksforgeeks.org/check-if-a-binary-tree-is-subtree-of-another-binary-tree/

我不确定这是一个好方法。想到分享。