找到二叉树的根值?

时间:2012-02-19 20:40:19

标签: algorithm binary-tree

我有一个存储值关系的数组,这使得几个树类似于:

enter image description here

因此,在这种情况下,我的数组将是(root,链接到)

(8,3) (8,10) (3,1) (3,6) (6,4) (6,7) (10,14) (14,13)

我想将数组中的所有根值设置为树中的主根(在所有树中):

(8,3) (8,1) (8,6) (8,4) (8,7) (8,10) (8,14) (8,13)

我应该调查哪种算法?

2 个答案:

答案 0 :(得分:6)

1)列出元组中所有唯一的第一个元素。

2)删除任何也作为元组的第二个元素出现的内容。

3)你将留下根(这里8)。用这个值替换所有元组的第一个元素。


编辑:

可以使用多个树的更复杂的方法如下。

首先,转换为父查找表:

1 -> 3
3 -> 8
4 -> 6
6 -> 3
7 -> 6
10 -> 8
13 -> 14
14 -> 10

接下来,在每个元素上运行“find parent with path compression”:

1)

1 -> 3 -> 8

给出

1 -> 8
3 -> 8
4 -> 6
...

3)

3 -> 8

4)

4 -> 6 -> 3 -> 8

给出

1 -> 8
3 -> 8
4 -> 8
6 -> 8
7 -> 6
...

6)

6 -> 8 (already done)

7)

7 -> 6 -> 8

结果:

1 -> 8
3 -> 8
4 -> 8
6 -> 8
7 -> 8
...

然后将其转换回元组列表:

(8,1)(8,3)(8,4)...

具有路径压缩算法的查找父级为find_set,用于不相交的集合林,例如。

int find_set(int x) const
{
    Element& element = get_element(x);
    int& parent = element.m_parent;
    if(parent != x)
    {
        parent = find_set(parent);
    }
    return parent;
}

关键是路径压缩可以帮助您避免大量工作。在上文中,例如,当您对4进行查找时,存储6 -> 8,这会使以后的查找更快地引用6

答案 1 :(得分:0)

假设你有一个代表点的元组列表:

def find_root(ls):
  child, parent, root = [], [], []
  for node in ls:
    parent.append(node[0])
    child.append(node[1])

  for dis in parent: 
    if (!child.count(dis)): 
      root.append(dis)

  if len(root) > 1 : return -1 # failure, the tree is not formed well

  for nodeIndex in xrange(len(ls)):
    ls[nodeIndex] = (root[0], ls[nodeIndex][1])

  return ls