algorithm - 在二叉树上实现随机过程

标签 algorithm random tree binary-tree implementation

考虑 N = 2^h - 1 个节点的完全二叉树上的这个随机过程

假设我有一个包含 N=2^h−1 个节点的二叉树,最初所有节点都没有标记,随着时间的推移,通过这个过程节点变得有标记。假设节点每次都有在[1,N]范围内的唯一标识符,我把一个节点的标识符发给你。当您收到发送的节点时。您标记它并调用以下标记规则,该规则在我发送下一个节点之前生效。

如果标记了一个节点及其兄弟节点,则标记了它的父节点。 如果标记了一个节点及其父节点,则标记了另一个兄弟节点。 在发送下一个节点之前尽可能递归地应用标记规则。

我需要实现这个过程并在 [10, 20] 范围内为 h 运行它十次,并找出我应该发送多少次节点才能完全标记所有节点......

我的问题是:表示此问题的二叉树的最佳方法是什么? 我想到的是将其视为堆并使用 int nodes[1 << h] 的数组。并执行标记规则,或者我使用像 BST 这样基于指针的结构?

另一件我难以理解的事情是,我应该如何实现上面描述的标记规则?(另外你应该注意,必须尽可能地应用这个规则)我的意思是以节点为参数的函数项和 ...

最佳答案

你可以构建一个Heap,并将它的所有元素初始化为0。标记可以通过将键设置为1来完成。然后你可以使用以下过程:

MARK(A, i)
l = LEFT(i)
r = RIGHT(i)
p = PARENT(i)
if(i <= A.heap-size and A[i] == 0)
    A[i] = 1
    if(l <= A.heap-size and r <= A.heap-size)
        if(A[l] == 1)
            if(A[r] == 0)
                MARK(A, r)
        else if(A[r] == 1)
            MARK(A, l)
    if(p != NIL)
        CHECK(A, p)

CHECK(A, i)
l = LEFT(i)
r = RIGHT(i)
if(l <= A.heap-size and A[l] == 1 and r <= A.heap-size and A[r] == 1)
    MARK(A, i)

关于algorithm - 在二叉树上实现随机过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27936272/

相关文章:

MySQL:从另一个表的随机行复制多个值

gwt - GWT 树的工具提示 : adding mouseovers to nodes

python - 在 python 中打印数字的唯一因子

java - 内存似乎没有按预期工作

php - 为什么 PHP 会这样选择随机值?

java - 如何用一定范围内的随机值填充 int 数组,并且每个值恰好有一个重复项?

javascript - TreeView 中的 Angular 复选框

haskell - 收集有关现有树状数据的数据

java - 获取背包中的对象列表

algorithm - 按升序对数组进行排序,同时最小化 "cost"