在二叉树上实现随机过程

Implementing a random process on binary tree

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

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

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

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

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

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

你可以建一个Heap,把它的所有元素都初始化为0。标记可以通过设置keys为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)