簡體   English   中英

如何從葉子到根構建二叉樹

[英]How to build a binary tree from the leaves to the root

從葉子到根的二叉樹的構建方法是相反的。 我正在為字符串編寫壓縮算法,然后應用此加密,例如,原始字符串為**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 :: vector。 如果您回想起堆是如何在堆排序中構建的,您將很容易弄清楚其結構。 這實際上不是原始堆,但是這種二叉樹表示形式可能非常有幫助。

因此,我寧願使用std :: vector以“反向”堆形式表示最終結構:初始向量將具有n = 6個元素:{44,333,55,555,4,333}

下一步,您需要進行n-1 = 5次運算,並將和加到向量的末尾,例如:{44,333,55,555,4,333,44333,33355,55555,5554,4333}

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

因此,在(n-1)+(n-2)+(n-3)+ ... + 1 =(n-1)* n / 2運算之后,您將得到相反順序的樹。

從右到左,您將按照BFS順序遍歷樹。

一種可能的解決方案可能是這樣

  1. 使所有給定值的treenode放入隊列。
  2. 從隊列中彈出第一個元素,將其命名為FIRST。 2.1從隊列中彈出下一個元素,並將其命名為SECOND。 如果不存在,則休息。 2.2創建一個節點TEMP treenode(它是FIRST和SECOND的XOR)。 2.3將FIRST和SECOND設為TEMP的子代。 2.4將TEMP放入隊列。 2.5從2開始重復步驟,直到隊列只有一個元素。
  3. 首先標記為根。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM