【问题标题】:How to find the maximum common subtree如何找到最大公共子树
【发布时间】:2014-09-08 23:12:39
【问题描述】:

有一棵树,树定义为

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

求最大公共子树(节点数最多,每个节点的val无所谓,只要子树的结构一样)

例如,

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

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

输出最大子树的根。

我认为蛮力方法不好,哈希呢,但我不知道如何哈希 树的结构。

【问题讨论】:

  • 表示有根(子)树的一种方法是使用包含左括号和右括号的字符串。这应该足以让您入门。

标签: algorithm hash tree


【解决方案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 -&gt; H,那么我们得到一个哈希函数。这是一种可能性。让f 成为从任意长度字符串到固定长度哈希字符串的pseudorandom function

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-15
    • 2011-10-04
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多