如何找到最大公共子树

时间:2014-09-08 14:32:07

标签: algorithm hash tree

有一棵树,树被定义为

public class TreeNode 
{
    int val;      
    vector<TreeNode *> children;      
    TreeNode(int x) { val = x; }      
} 

请找到maxmum公共子树(拥有最多的节点,每个节点的val无关紧要,只是子树的结构是相同的)

前,

           1                   
      /    |      \                  
     2     3       4                 
    /    / | \   / | \                
   5    6  7  8  9 10 11               

根3和4的子树是maxmum公共子树(注意,可能有两个以上的子树是公共子树),

输出最大子树的根。

我认为蛮力方法不好,哈希怎么样,但我不知道如何哈希 一棵树的结构。

1 个答案:

答案 0 :(得分:1)

哈希听起来不错。让我们切换到一般树的二叉树表示,其中二叉树的左子节点是一般树的第一个子节点,二叉树的右子节点是一般树的下一个兄弟节点。你的树现在看起来像这样。

      1
     / \
    2   3
   /   / \
  /   /   \
 /   /     \
5   6       4
     \     /
      7   9
       \   \
        8   10
             \
              11

我们可以使用nilcons对此树进行Lisp样式编码。

cons(cons(cons(nil, nil),
          nil),
     cons(cons(nil,
               cons(nil,
                    cons(nil, nil))),
          cons(cons(nil,
                    cons(nil,
                         cons(nil, nil))),
               nil)))

H成为哈希值的集合。如果我们在哈希值上指定哈希值nil : H和二进制运算符cons : H * H -> H,那么我们得到哈希函数。这是一种可能性。让fpseudorandom function,从任意长度的字符串到固定长度的哈希字符串。

nil = f("")
cons(a, b) = f(a + b)