如何构建从叶子到根的二叉树

How to build a binary tree from the leaves to the root

本文关键字:叶子 二叉树 何构建 构建      更新时间:2023-10-16

如何构建一个从叶子到根的二叉树,这是相反的方向。我正在为字符串编写一个压缩算法,xor应用这种加密,例如,我们将原始字符串作为**44**333**55**555**4**333**

xo = 44, x1 = 333, x2 = 55, x3 = 555, x4 = 4, x5 = 333 <=> **x0**x1**x2**x3**x4**x5,

应用此算法,我们得到:

x01 = x0 xor x1, x23 = x2 xor x3, x45 = x4 xor x5 <=> **x01**x23**x45**

再次,

x0123 = x01 xor x23 and x012345 = x0123 xor x23

这种结构很容易在二叉树中保持,但如何构建一个反向的二叉树。

您可以轻松地使用一个简单的std::向量来实现此目的。如果您回忆一下堆是如何在heapsort中构建的,您就会很容易地弄清楚它的结构。这实际上不是原始堆,但这种二进制树表示可能非常有用。

因此,我宁愿使用std::vector以"反向"堆的形式表示最终结构:初始矢量将由n=6个元素组成:{44333355544333}

下一步,您进行n-1=5次运算,并将和添加到向量的末尾,如:{4433335555554433335555535554455544333}

下一步4使用尾部元素进行操作:{443333555555433443333555333555555555555553555555555445555443333}

所以,在(n-1)+(n-2)+(n-3)+…+之后1=(n-1)*n/2次操作,您将以相反的顺序获得树。

从右向左,你将按照BFS的顺序遍历你的树。

一个可能的解决方案是这个

  1. 生成所有给定值的树节点,并将它们放入队列中
  2. 将队列中的第一个元素命名为first。2.1从队列中弹出下一个元素,并将其命名为SECOND。如果不存在中断。2.2创建一个节点TEMP树节点(它是FIRST和SECOND的XOR)。2.3将FIRST和SECOND作为TEMP的子级。2.4将TEMP推入队列。2.5从2开始重复步骤,直到队列只有一个元素
  3. 将第一个标记为root