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

时间:2013-07-14 07:07:39

标签: c++ algorithm binary-tree xor

如何从叶子到根的构建二叉树是相反的方向。 我正在为字符串编写压缩算法,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

这种结构很容易在二叉树中保存,但是如何在二叉树的方向上构建反向。

2 个答案:

答案 0 :(得分:1)

为此,您可以轻松使用简单的std :: vector。如果你还记得如何在堆中构建堆,你将很容易地找出结构。这实际上不是原始堆,但这种二叉树表示非常有用。

所以,我宁愿使用std :: vector代表“反向”堆形式的最终结构: 初始向量将是n = 6个元素:{44,333,55,555,4,333}

下一步你做n-1 = 5次操作并将总和加到矢量的末尾,如:{44,333,55,555,4,333,44333,33355,5555,5554,4333} < / p>

尾部元素的下一步4操作:{44,333,55,555,4,333,44333,33355,5555,5554,4333,4433333355,3335555555,555555554,55544333}

因此,在(n - 1)+(n - 2)+(n - 3)+ ... + 1 =(n - 1)* n / 2次操作之后,您将以相反的顺序得到您的树。 / p>

从右到左,您将以BFS顺序遍历您的树。

答案 1 :(得分:0)

一种可能的解决方案是

  1. 制作所有给定值的treenodes并将它们放入队列中。
  2. 首先从队列名称中弹出第一个元素。 2.1从队列中弹出下一个元素并将其命名为SECOND。如果不存在休息。 2.2创建一个节点TEMP treenode(它是FIRST和SECOND的XOR)。 2.3作为TEMP的孩子,做第一和第二。 2.4将TEMP推入队列。 2.5从2重复步骤,直到队列只有一个元素。
  3. 首先以root身份标记。