簡體   English   中英

從符號列表開始構建樹

[英]Building trees starting from a list of symbols

我有一個由格式正確的括號組成的符號列表,我想生成一棵像這樣的樹:

具有圓括號的樹

葉子節點是符號,非終端節點代表括號,我想將它們都存儲在結構中。

有沒有辦法建立這棵樹?

將整個公式拆分為直接后代的塊應該很容易,而每個塊的格式都正確。 為此,請使用嵌套級別計數:右括號會增加級別,右括號會降低級別,並且每當嵌套級別為0時,塊之間就會有邊界。

這樣,您可以轉換

((a b) (c d)) e ((f g h) i)

分為幾個組成部分:

((a b) (c d))
e
((f g h) i)

對於每個部分,如果它包含多個符號,則遞歸運行相同的算法。

當然。 首先,如果實現的語言中括號是句法收集標點符號(例如Python列表),則可以使用內置的求值函數將輸入解析為所需的結構。

失敗了...我相信以下內容只是先前答案的更詳細版本。 步驟很簡單(遞歸應該很簡單,不是嗎?):

  1. 如果輸入是原子的,則使其成為葉節點並返回。
  2. 將給定列表拆分為括號內每個內部0處的元素。
  3. 對於此列表中的每個元素:

    3a。 刪除最外面的括號;

    3b。 將括號計數分別減少1;

    3c。 重復此元素。

現在,讓我們看一下您給出的示例。我忽略了原始的根節點文本,而是使用樹中顯示的結構:

[(A ((B C) (D E)))(F G (H I L))]

在每個級別上,首先要做的是除去最外面的括號(在這種情況下,實際上是括號。我不確定為什么在外面有不同的符號)。

(A ((B C) (D E)))(F G (H I L))

現在,從最前面開始,計算您有多少個開放括號。

(A ((B C) (D E)))(F G (H I L))
1  23   2 3   2101    2     10

注意:如果需要引發語法錯誤以實現不平衡,請檢查一下:最終計數必須為0,且不得包含以下字符。

無論您在中間的哪個位置有0,都請斷開字符串(用^標記):

(A ((B C) (D E)))  ^  (F G (H I L))
1  23   2 3   210     1    2     10

現在,重復找到的每個元素。 如果元素是原子的,則為葉節點。 如果要節省計數時間,請將計數作為例程的另一個參數攜帶。 遞歸時將其減少1。

                 ^
A ((B C) (D E))     F G (H I L)
  12   1 2   10         1     0

左側有兩個元素:一個葉節點A,以及另一個我們要在其上遞歸的表達式:

((B C) (D E))
12   1 2   10

內部沒有0,因此我們簡單地遍歷整個列表:

(B C) (D E)
1   0 1  0

分為兩個列表, (BC)(DE)

類似地,根節點的右分支分為三個元素: F,G(HIL) 以相同的方式處理這些。

暫無
暫無

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

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