如何构建从叶子到根的二叉树
How to build a binary tree from the leaves to the root
如何构建一个从叶子到根的二叉树,这是相反的方向。我正在为字符串编写一个压缩算法,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的顺序遍历你的树。
一个可能的解决方案是这个
- 生成所有给定值的树节点,并将它们放入队列中
- 将队列中的第一个元素命名为first。2.1从队列中弹出下一个元素,并将其命名为SECOND。如果不存在中断。2.2创建一个节点TEMP树节点(它是FIRST和SECOND的XOR)。2.3将FIRST和SECOND作为TEMP的子级。2.4将TEMP推入队列。2.5从2开始重复步骤,直到队列只有一个元素
- 将第一个标记为root
- 从父数组测试用例构造二叉树失败
- 打印时有二叉树问题.用户输入不打印任何内容
- 试图找到二叉树的深度
- 二叉树结构平衡,使用递归时EXC_BAD_ACCESS
- 指向二叉树中新节点的指针
- 我试图用这段代码找到二叉树的高度,但它一直返回 0,有人可以告诉我为什么吗?
- C++:如何计算二叉树中其值模块高度小于 2 的节点数?
- 二叉树级别顺序遍历在leetcode中
- 运行无限循环的最小二叉树问题
- 打印二叉树中的常见元素
- 二叉树基准测试结果
- 带有矢量重复值的二叉树打印出来
- 签入二叉树的函数是平衡C++
- 我有两棵二叉树.我想在不更改输入树的情况下深度复制两个二叉树的结果
- 如何计算给定数字在二叉树中出现的次数?
- 为什么我的二叉树会覆盖其根的叶子?
- 如何获取二叉树代码上的叶子数量
- 在二叉树中找到最低的叶子
- C++ 二叉树:返回节点的后代数.一片叶子有零.如果未找到树数据,则返回 -1
- 如何构建从叶子到根的二叉树