5.13.樹、森林與二叉樹的轉換

當使用"孩子兄弟表示法"存儲樹或森林時,最終會呈現出與二叉樹類似的形態,

所以樹、森林與二叉樹之間的轉換本質上就是畫出采用孩子兄弟表示法存儲的樹和森林。


一."樹->二叉樹"的轉換:

1.例一:

以上述圖片左邊的樹為例,

現將該樹轉化為二叉樹,本質上就是用孩子兄弟表示法存儲該樹,

"樹->二叉樹"轉換技巧:

  1. 首先在一棵二叉樹中畫出樹的根節點
  2. 按"樹的層序"依次處理每個結點

上述圖片左邊的樹的根結點為A,因此轉換后的二叉樹的根結點也為A,

如下圖:

如上圖,

接下來需要按"樹的層序"依次處理每個結點,這是什么意思呢?

也就是說先處理樹中第一層的A,再處理第二層的B、C,接下來處理第三層的D、H、F、E、J、K,最后處理第四層的G、I、L,就是一層一層的按順序處理結點,按這種方式處理的話不容易亂,

首先處理樹中第一層的A,處理的方法如下:

如上圖,

首先要觀察當前處理的結點即A在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于A結點來說,他有B、C兩個孩子,因此需要把B、C用右指針串成一個"冰糖葫蘆"的形態,

如下圖:

如上圖,

接下來要在創建的二叉樹中把A結點的第一個孩子即B掛在當前處理的結點即A的左指針上,

如下圖:

如上圖,

A結點處理完畢,接下來處理B結點,同理,

首先要觀察當前處理的結點即B在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于B結點來說,他有D、H、F三個孩子,因此需要把D、H、F用右指針串成一個"冰糖葫蘆"的形態,

如下圖:

如上圖,

接下來要在創建的二叉樹中把B結點的第一個孩子即D掛在當前處理的結點即B的左指針上,

如下圖:

如上圖,

B結點處理完畢,接下來處理C結點,同理,

首先要觀察當前處理的結點即C在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于C結點來說,他有E、J、K三個孩子,因此需要把E、J、K用右指針串成一個"冰糖葫蘆"的形態,

如下圖:

如上圖,

接下來要在創建的二叉樹中把C結點的第一個孩子即E掛在當前處理的結點即C的左指針上,

如下圖:

如上圖,

C結點處理完畢,接下來按照"樹的層序"應該處理D結點,同理,

首先要觀察當前處理的結點即D在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于D結點來說,顯然沒有孩子,所以D結點不需要做任何處理;

D結點處理完畢,接下來處理H結點,同理,

首先要觀察當前處理的結點即H在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于H結點來說,他有G、I、L三個孩子,因此需要把G、I、L用右指針串成一個"冰糖葫蘆"的形態,

如下圖:

如上圖,

接下來要在創建的二叉樹中把H結點的第一個孩子即G掛在當前處理的結點即H的左指針上,

如下圖:

如上圖,

H結點處理完畢,接下來按照"樹的層序"應該依次處理F、E、J、K、G、I、L結點,同理,

首先要觀察當前處理的結點在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于F、E、J、K、G、I、L結點來說,顯然都沒有孩子,所以F、E、J、K、G、I、L結點都不需要做任何處理,

至此,就完成了"樹->二叉樹"的轉換,

如下圖:

2.例二:原理同例一

以上述圖片左邊的樹為例,

現將該樹轉化為二叉樹,本質上就是用孩子兄弟表示法存儲該樹,

上述圖片左邊的樹的根結點為A,因此轉換后的二叉樹的根結點也為A,

如下圖:

如上圖,

首先要觀察當前處理的結點即A在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于A結點來說,他有B、C、F、L四個孩子,因此需要把B、C、F、L用右指針串成一個"冰糖葫蘆"的形態,

如下圖:

如上圖,

接下來要在創建的二叉樹中把A結點的第一個孩子即B掛在當前處理的結點即A的左指針上,

如下圖:

如上圖,

A結點處理完畢,接下來需要按"樹的層序"依次處理每個結點,因此接下來處理B結點,

首先要觀察當前處理的結點即B在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于B結點來說,他有D、H兩個孩子,因此需要把D、H用右指針串成一個"冰糖葫蘆"的形態,

如下圖:

如上圖,

接下來要在創建的二叉樹中把B結點的第一個孩子即D掛在當前處理的結點即B的左指針上,

如下圖:

如上圖,

B結點處理完畢,接下來需要按"樹的層序"依次處理每個結點,因此接下來處理C結點,

首先要觀察當前處理的結點即C在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于C結點來說,他有E、J兩個孩子,因此需要把E、J用右指針串成一個"冰糖葫蘆"的形態,

如下圖:

如上圖,

接下來要在創建的二叉樹中把C結點的第一個孩子即E掛在當前處理的結點即C的左指針上,

如下圖:

如上圖,

C結點處理完畢,接下來需要按"樹的層序"依次處理每個結點,因此接下來處理F結點,

首先要觀察當前處理的結點即F在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于F結點來說,他只有一個孩子即K結點,

因此接下來要在創建的二叉樹中把F結點的第一個孩子即K掛在當前處理的結點即F的左指針上,

如下圖:

如上圖,

F結點處理完畢,接下來需要按"樹的層序"依次處理每個結點,因此接下來處理L結點,

首先要觀察當前處理的結點即L在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于L結點來說,L結點沒有孩子,所以不需要處理,

如下圖:

如上圖,

L結點處理完畢,接下來需要按"樹的層序"依次處理每個結點,因此接下來處理D結點,

首先要觀察當前處理的結點即D在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于D結點來說,他只有一個孩子即G結點,

因此接下來要在創建的二叉樹中把D結點的第一個孩子即G掛在當前處理的結點即D的左指針上,

如下圖:

如上圖,

D結點處理完畢,接下來需要按"樹的層序"依次處理每個結點,因此接下來處理H結點,

首先要觀察當前處理的結點即H在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于H結點來說,H結點沒有孩子,所以不需要處理,

如下圖:

如上圖,

H結點處理完畢,接下來需要按"樹的層序"依次處理每個結點,因此接下來處理E結點,

首先要觀察當前處理的結點即E在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于E結點來說,他只有一個孩子即I結點,

因此接下來要在創建的二叉樹中把E結點的第一個孩子即I掛在當前處理的結點即E的左指針上,

如下圖:

如上圖,

E結點處理完畢,接下來按照"樹的層序"應該依次處理J、K、G、I結點,同理,

首先要觀察當前處理的結點在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于J、K、G、I結點來說,顯然都沒有孩子,所以J、K、G、I結點都不需要做任何處理,

至此,就完成了"樹->二叉樹"的轉換,

如下圖:


二."森林->二叉樹"的轉換:

1.例一:

如上圖,

"森林->二叉樹"的轉換思路與"樹->二叉樹"的轉換思路類似,

唯一需要注意的是第一步中樹只有1個根結點,而森林至少有2兩個平級的根結點,

森林中所有的根結點視為平級的兄弟結點,

所以森林轉換為二叉樹的時候,第一步需要把森林中所有的根結點用右指針"串成糖葫蘆",

本例中森林的根結點為A、D、G,

如下圖:

如上圖,

接下來按照"森林的層序"依次處理每個結點,"森林的層序"就是指把整個森林看作一個整體,

第一層就是A、D、G,第二層就是B、C、E、H、I、J,第三層就是F、K、L、M、N、O,第四層就是P,因此處理順序就是A->D->G->B->C->E->H->I->J->F->K->L->M->N->O->P,

首先處理樹中第一層的A,處理的方法如下:

如上圖,

首先要觀察當前處理的結點即A在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于A結點來說,他有B、C兩個孩子,因此需要把B、C用右指針串成一個"冰糖葫蘆"的形態,

如下圖:

如上圖,

接下來要在創建的二叉樹中把A結點的第一個孩子即B掛在當前處理的結點即A的左指針上,

如下圖:

如上圖,

A結點處理完畢,接下來需要按"樹的層序"依次處理每個結點,因此接下來處理D結點,

首先要觀察當前處理的結點即D在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于D結點來說,他只有一個孩子即E結點,

因此接下來要在創建的二叉樹中把D結點的第一個孩子即E掛在當前處理的結點即D的左指針上,

如下圖:

如上圖,

D結點處理完畢,接下來需要按"樹的層序"依次處理每個結點,因此接下來處理G結點,

首先要觀察當前處理的結點即G在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于G結點來說,他有H、I、J三個孩子,因此需要把H、I、J用右指針串成一個"冰糖葫蘆"的形態,

如下圖:

如上圖,

接下來要在創建的二叉樹中把G結點的第一個孩子即H掛在當前處理的結點即G的左指針上,

如下圖:

如上圖,

G結點處理完畢,接下來按照"樹的層序"應該依次處理B、C結點,同理,

首先要觀察當前處理的結點在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于B、C結點來說,顯然都沒有孩子,所以B、C結點都不需要做任何處理;

B、C結點處理完畢,接下來需要按"樹的層序"依次處理每個結點,因此接下來處理E結點,

首先要觀察當前處理的結點即E在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于E結點來說,他只有一個孩子即F結點,

因此接下來要在創建的二叉樹中把E結點的第一個孩子即F掛在當前處理的結點即E的左指針上,

如下圖:

如上圖,

E結點處理完畢,接下來需要按"樹的層序"依次處理每個結點,因此接下來處理H結點,

首先要觀察當前處理的結點即H在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于H結點來說,他有K、L兩個孩子,因此需要把K、L用右指針串成一個"冰糖葫蘆"的形態,

如下圖:

如上圖,

接下來要在創建的二叉樹中把H結點的第一個孩子即K掛在當前處理的結點即H的左指針上,

如下圖:

如上圖,

H結點處理完畢,接下來按照"樹的層序"應該處理I結點,同理,

首先要觀察當前處理的結點即I在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于I結點來說,顯然都沒有孩子,所以I結點都不需要做任何處理;

I結點處理完畢,接下來需要按"樹的層序"依次處理每個結點,因此接下來處理J結點,

首先要觀察當前處理的結點即J在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于J結點來說,他有M、N、O三個孩子,因此需要把M、N、O用右指針串成一個"冰糖葫蘆"的形態,

如下圖:

如上圖,

接下來要在創建的二叉樹中把J結點的第一個孩子即M掛在當前處理的結點即J的左指針上,

如下圖:

上圖,

J結點處理完畢,接下來按照"樹的層序"應該依次處理F、K、L結點,同理,

首先要觀察當前處理的結點在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于F、K、L結點來說,顯然都沒有孩子,所以F、K、L結點都不需要做任何處理;

F、K、L結點處理完畢,接下來需要按"樹的層序"依次處理每個結點,因此接下來處理M結點,

首先要觀察當前處理的結點即M在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于M結點來說,他只有一個孩子即P結點,

因此接下來要在創建的二叉樹中把M結點的第一個孩子即P掛在當前處理的結點即M的左指針上,

如下圖:

如上圖,

M結點處理完畢,接下來按照"樹的層序"應該依次處理N、O、P結點,同理,

首先要觀察當前處理的結點在樹中是否有孩子,如果有孩子,那么就要把它所有的孩子"用右指針串成糖葫蘆",

對于N、O、P結點來說,顯然都沒有孩子,所以N、O、P結點都不需要做任何處理,

至此,就完成了"森林->二叉樹"的轉換,

如下圖:

2.例二:原理同例一

如上圖,

"森林->二叉樹"的轉換思路與"樹->二叉樹"的轉換思路類似,

唯一需要注意的是第一步中樹只有1個根結點,而森林至少有2兩個平級的根結點,

森林中所有的根結點視為平級的兄弟結點,

所以森林轉換為二叉樹的時候,第一步需要把森林中所有的根結點用右指針"串成糖葫蘆",

本例中森林的根結點為A、C、F、L,

如下圖:

如上圖,

接下來按照"森林的層序"依次處理每個結點,"森林的層序"就是指把整個森林看作一個整體,

第一層就是A、C、F、L,第二層就是B、E、J、K,第三層就是D、H、I,第四層就是G,因此處理順序就是A->C->F->L->B->E->J->K->D->H->I->G,

處理方法同例一,

最終的結果如下圖:


三."二叉樹->樹"的轉換:

1.例一:

以上述圖片左邊的二叉樹為例,

現在把該二叉樹轉換為樹,

"二叉樹->樹"的轉換技巧:

  1. 先畫出樹的根結點
  2. 從樹的根結點開始,按"樹的層序"恢復每個結點的孩子

(注:按"樹的層序"是為了不容易出錯)

上述圖片左邊的二叉樹的根結點為A,因此轉換后的樹的根結點為A,

如下圖:

如上圖,

接下來從樹的根結點A開始,按"樹的層序"恢復每個結點的孩子(注意是從樹的層序開始恢復,不是二叉樹,也就是按照上述圖片右邊的樹的層序恢復,不是上述圖片左邊的二叉樹),

那么如何恢復一個結點的孩子呢?

當前處理的是根結點A,也就是要恢復結點A的孩子,此時就要觀察在上述圖片內左側的二叉樹中結點A有沒有左孩子,如果有左孩子,那么就要把它的左孩子以及"一整串右指針糖葫蘆"拆下來(如果沒有左孩子,就不需要做恢復孩子的處理;如果有左孩子但沒有"一整串右指針糖葫蘆",那么只需要把左孩子掛上即可,"一整串右指針糖葫蘆"看作NULL)->對于A結點來說,就需要把它的左孩子即B結點以及"一整串右指針糖葫蘆"即C結點拆下來,再把B、C分別掛在A結點的下方,

如下圖:

如上圖,

至此,A結點的孩子恢復完畢,按照"樹的層序",接下來要恢復B結點的孩子(注:是按照樹的層序,即按照上述圖片右邊的樹的層序,不是上述圖片左邊的二叉樹),

當前處理的是B結點,此時就要觀察在上述圖片內左側的二叉樹中結點B有沒有左孩子,如果有左孩子,那么就要把它的左孩子以及"一整串右指針糖葫蘆"拆下來->對于B結點來說,就需要把它的左孩子即D結點以及"一整串右指針糖葫蘆"即H、F結點拆下來,再把D、H、F分別掛在B結點的下方,

如下圖:

如上圖,

至此,B結點的孩子恢復完畢,按照"樹的層序",接下來要恢復C結點的孩子(注:是按照樹的層序,即按照上述圖片右邊的樹的層序,不是上述圖片左邊的二叉樹),

當前處理的是C結點,此時就要觀察在上述圖片內左側的二叉樹中結點C有沒有左孩子,如果有左孩子,那么就要把它的左孩子以及"一整串右指針糖葫蘆"拆下來->對于C結點來說,就需要把它的左孩子即E結點以及"一整串右指針糖葫蘆"即J、K結點拆下來,再把E、J、K分別掛在C結點的下方,

如下圖:

如上圖,

至此,C結點的孩子恢復完畢,按照"樹的層序",接下來要恢復D結點的孩子(注:是按照樹的層序,即按照上述圖片右邊的樹的層序,不是上述圖片左邊的二叉樹),

當前處理的是D結點,此時就要觀察在上述圖片內左側的二叉樹中結點D有沒有左孩子,如果有左孩子,那么就要把它的左孩子以及"一整串右指針糖葫蘆"拆下來->對于D結點來說,由于D結點的左指針為空,說明D結點沒有左孩子,所以D結點不需要做恢復孩子的處理;

至此,D結點的孩子恢復完畢,按照"樹的層序",接下來要恢復H結點的孩子(注:是按照樹的層序,即按照上述圖片右邊的樹的層序,不是上述圖片左邊的二叉樹),

當前處理的是H結點,此時就要觀察在上述圖片內左側的二叉樹中結點H有沒有左孩子,如果有左孩子,那么就要把它的左孩子以及"一整串右指針糖葫蘆"拆下來->對于H結點來說,就需要把它的左孩子即G結點以及"一整串右指針糖葫蘆"即I、L結點拆下來,再把G、I、L分別掛在H結點的下方,

如下圖:

如上圖,

至此,H結點的孩子恢復完畢,按照"樹的層序",接下來要依次恢復F、E、J、K、G、I、L結點的孩子(注:是按照樹的層序,即按照上述圖片右邊的樹的層序,不是上述圖片左邊的二叉樹),

然而對于F、E、J、K、G、I、L結點來說,F、E、J、K、G、I、L結點在上述圖片內左側的二叉樹中都沒有左孩子,所以F、E、J、K、G、I、L結點都不需要做恢復孩子的處理,

至此,就完成了上述圖片中左邊的"二叉樹->樹"的轉換,

如下圖:

2.例二:原理同例一


四."二叉樹->森林"的轉換:

1.例一:

如上圖,

"二叉樹->森林"的轉換思路與"二叉樹->樹"的轉換思路類似,

唯一需要注意的是森林中至少有兩棵樹,

所以把二叉樹轉換為森林的時候首先要把二叉樹的根結點和根結點右指針上的一整串結點全部拆下來,

上述圖片中左邊的二叉樹的根結點為A,A的右指針上的一整串結點依次為D、G,

因此A、D、G分別是該森林中三棵樹的根結點,

如下圖:

如上圖,

接下來按照"森林的層序"依次恢復結點的孩子,

首先需要恢復A結點的孩子,此時就要觀察在上述圖片內左側的二叉樹中結點A有沒有左孩子,如果有左孩子,那么就要把它的左孩子以及"一整串右指針糖葫蘆"拆下來->對于A結點來說,就需要把它的左孩子即B結點以及"一整串右指針糖葫蘆"即C結點拆下來,再把B、C分別掛在A結點的下方,

如下圖:

如上圖,

至此,A結點的孩子恢復完畢,接下來按照"森林的層序"依次恢復結點的孩子,

因此需要恢復D結點的孩子,此時就要觀察在上述圖片內左側的二叉樹中結點D有沒有左孩子,如果有左孩子,那么就要把它的左孩子以及"一整串右指針糖葫蘆"拆下來->對于D結點來說,就需要把它的左孩子即E結點拆下來,由于E結點的"一整串右指針糖葫蘆"為空,因此不需要管,所以只需要把E掛在D結點的下方即可,

如下圖:

如上圖,

至此,D結點的孩子恢復完畢,接下來按照"森林的層序"依次恢復結點的孩子,

因此需要恢復G結點的孩子,此時就要觀察在上述圖片內左側的二叉樹中結點G有沒有左孩子,如果有左孩子,那么就要把它的左孩子以及"一整串右指針糖葫蘆"拆下來->對于G結點來說,就需要把它的左孩子即H結點以及"一整串右指針糖葫蘆"即I、J結點拆下來,再把H、I、J分別掛在G結點的下方,

如下圖:

如上圖,

至此,G結點的孩子恢復完畢,接下來按照"森林的層序"依次恢復結點的孩子,

因此需要恢復B結點的孩子,此時就要觀察在上述圖片內左側的二叉樹中結點B有沒有左孩子,如果有左孩子,那么就要把它的左孩子以及"一整串右指針糖葫蘆"拆下來->對于B結點來說,B結點沒有左孩子,因此B結點不需要做恢復孩子的處理,同理按照"森林的層序"接下來需要恢復C結點的孩子,由于C結點在上述圖片內左側的二叉樹中沒有左孩子,所以也不需要做恢復孩子的處理;

接下來按照"森林的層序"依次恢復結點的孩子,

因此需要恢復E結點的孩子,此時就要觀察在上述圖片內左側的二叉樹中結點E有沒有左孩子,如果有左孩子,那么就要把它的左孩子以及"一整串右指針糖葫蘆"拆下來->對于E結點來說,就需要把它的左孩子即F結點拆下來,由于F結點的"一整串右指針糖葫蘆"為空,因此不需要管,所以只需要把F掛在E結點的下方即可,

如下圖:

如上圖,

至此,E結點的孩子恢復完畢,接下來按照"森林的層序"依次恢復結點的孩子,

因此需要恢復H結點的孩子,此時就要觀察在上述圖片內左側的二叉樹中結點H有沒有左孩子,如果有左孩子,那么就要把它的左孩子以及"一整串右指針糖葫蘆"拆下來->對于H結點來說,就需要把它的左孩子即K結點以及"一整串右指針糖葫蘆"即L結點拆下來,再把K、L分別掛在H結點的下方,

如下圖:

如上圖,

至此,H結點的孩子恢復完畢,接下來按照"森林的層序"依次恢復結點的孩子,

因此需要恢復I結點的孩子,此時就要觀察在上述圖片內左側的二叉樹中結點I有沒有左孩子,如果有左孩子,那么就要把它的左孩子以及"一整串右指針糖葫蘆"拆下來->對于I結點來說,I結點沒有左孩子,因此I結點不需要做恢復孩子的處理;

接下來按照"森林的層序"依次恢復結點的孩子,

因此需要恢復J結點的孩子,此時就要觀察在上述圖片內左側的二叉樹中結點J有沒有左孩子,如果有左孩子,那么就要把它的左孩子以及"一整串右指針糖葫蘆"拆下來->對于J結點來說,就需要把它的左孩子即M結點以及"一整串右指針糖葫蘆"即N、O結點拆下來,再把M、N、O分別掛在J結點的下方,

如下圖:

如上圖,

至此,J結點的孩子恢復完畢,接下來按照"森林的層序"依次恢復結點的孩子,

因此需要依次恢復F、K、L結點的孩子,此時就要觀察在上述圖片內左側的二叉樹中結點F、K、L有沒有左孩子,如果有左孩子,那么就要把它們的左孩子以及"一整串右指針糖葫蘆"拆下來->對于F、K、L結點來說,F、K、L結點都沒有左孩子,因此F、K、L結點都不需要做恢復孩子的處理;

接下來按照"森林的層序"依次恢復結點的孩子,

因此需要恢復M結點的孩子,此時就要觀察在上述圖片內左側的二叉樹中結點M有沒有左孩子,如果有左孩子,那么就要把它的左孩子以及"一整串右指針糖葫蘆"拆下來->對于M結點來說,就需要把它的左孩子即P結點拆下來,由于P結點的"一整串右指針糖葫蘆"為空,因此不需要管,所以只需要把P掛在M結點的下方即可,

如下圖:

如上圖,

至此,M結點的孩子恢復完畢,接下來按照"森林的層序"依次恢復結點的孩子,

因此需要依次恢復N、O、P結點的孩子,此時就要觀察在上述圖片內左側的二叉樹中結點N、O、P有沒有左孩子,如果有左孩子,那么就要把它們的左孩子以及"一整串右指針糖葫蘆"拆下來->對于N、O、P結點來說,N、O、P結點都沒有左孩子,因此N、O、P結點都不需要做恢復孩子的處理,

至此,就完成了上述圖片左邊的"二叉樹->森林"的轉換,

如下圖:

2.例二:原理同例一


五.總結:


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916481.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916481.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916481.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring 核心流程

Spring 核心流程前言一、AbstractApplicationContext#refresh 方法解析1.1 前置1.2 refresh 方法1.2.1 prepareRefresh1.2.2 obtainFreshBeanFactory1.2.3 prepareBeanFactory1.2.4 postProcessBeanFactory1.2.5 invokeBeanFactoryPostProcessors1.2.6 registerBeanPostProcess…

RS485轉Profinet網關與JRT激光測距傳感器在S7-1200 PLC系統中的技術解析與應用

RS485轉Profinet網關與JRT激光測距傳感器在S7-1200 PLC系統中的技術解析與應用技術核心:協議轉換與數據橋梁在工業自動化系統中,RS485轉Profinet網關承擔著協議翻譯官的角色。以XD-MDPN100型號為例,其本質是將RS485設備的串口數據封裝為Profi…

《C++ string 完全指南:string的模擬實現》

string的模擬實現 文章目錄string的模擬實現一、淺拷貝和深拷貝1.淺拷貝2.深拷貝3.寫時拷貝二、定義string的成員變量三、string的接口實現1.string的默認成員函數(1)構造函數實現(2)析構函數實現(3)拷貝構…

造成服務器內存不足的原因有什么

服務器在日常的運行過程中,會存儲大量關于企業重要的數據信息,偶爾會出現內存飆升空間不足的情況,服務器內存作為服務器數據處理和存儲的主要空間,異常占用會導致服務器性能降低,影響到企業業務的響應速度,…

JVM、Dalvik、ART垃圾回收機制

一、JVM垃圾回收機制(桌面/服務器端)1. 核心算法:分代收集新生代回收(Minor GC)觸發條件:Eden區滿時觸發算法:復制算法(Eden → Survivor區)過程:存活對象在S…

數學專業轉型數據分析競爭力發展報告

一、核心優勢拆解(1)數學能力與數據分析對應關系數學課程數據分析應用場景比較優勢說明概率論假設檢驗設計能準確判斷統計顯著性閾值實變函數數據質量評估異常值檢測的嚴格性更高線性代數特征工程構建矩陣運算優化模型訓練效率(2)…

JAVA進階--MySQL

一.MySQL架構連接層:處理客戶端連接服務,認證授權相關的操作服務層:最核心的一層(核心服務功能),處理sql,包括sql優化,函數調用....存儲引擎層:存儲引擎是真正負責來操作數據的(mysql中數據的存儲和提取), mysql中有不同存儲引擎,…

【架構】Docker簡單認知構建

作為一個之前從來沒有接觸過Docker的倒霉蛋,想了解學習一下Docker 搜了CSDN和RUNOOB,得到的描述如下: Docker 是一個開源的應用容器引擎,基于 Go 語言 并遵從 Apache2.0 協議開源。 Docker 可以讓開發者打包他們的應用以及依賴包…

C++ std::list概念與使用案例

C std::list 概念詳解 std::list 是 C 標準模板庫(STL)中的一個雙向鏈表容器。與 vector 和 array 不同,它不保證元素在內存中連續存儲,而是通過指針將各個元素連接起來。 核心特性 雙向鏈表結構: 每個元素包含指向前驅…

從0到1學Pandas(六):Pandas 與數據庫交互

目錄一、數據庫基礎操作1.1 連接數據庫1.2 執行 SQL 查詢1.3 創建與修改表結構二、數據導入導出2.1 從數據庫讀取數據2.2 將數據寫入數據庫2.3 大數據量處理三、數據庫事務處理3.1 事務概念與實現3.2 批量數據更新3.3 錯誤處理與回滾四、數據庫性能優化4.1 查詢性能優化4.2 連接…

GitHub 趨勢日報 (2025年07月26日)

📊 由 TrendForge 系統生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日報中的項目描述已自動翻譯為中文 📈 今日獲星趨勢圖 今日獲星趨勢圖602Qwen3-Coder573neko527hrms275BillionMail153Win11Debloat115hyperswitch57data…

機器人仿真(2)Ubuntu24.04下RTX5090配置IsaacSim與IsaacLab

目錄 一、前言二、電腦配置三、配置步驟3.1 創建Conda環境3.2 安裝PyTorch3.3 安裝Isaac Sim3.4 安裝Isaac Lab 四、總結 一、前言 博主自從去年開始就一直在關注Isaac Lab和Isaac Sim,但是一直以來由于手頭設備只有4060,甚至沒有達到最低配置16GB顯存要…

DaVinci Resolve 19.0(達芬奇)軟件安裝包下載及詳細安裝教程|附帶安裝文件

[軟件名稱]:ArcGIS [軟件大小]:2.99 GB [系統要求]:支持Win7及更高版本 [下載通道]: 迅雷網盤 [下載鏈接]:高速下載地址 https://pan.xunlei.com/s/VOW9nw-JV99A_7f_5hhpgqO2A1?pwdbufh# ??:先用手機下載迅雷網盤保存到手機中&#xff0c…

Java學習第八十一部分——Shiro

目錄 📫 一、前言提要簡介 🛡? 二、核心功能介紹 ?? 三、核心架構組件 ? 四、與Java的關系 ?? 五、與Spring Security對比 🧩 六、典型應用場景 💎 七、總結歸納概述 📫 一、前言提要簡介 Apache Shiro 是…

虛擬機ubuntu20.04共享安裝文件夾

ubuntu20.04共享安裝文件夾 4.5 共享安裝文件夾 將Windows存放安裝文件的文件夾共享給虛擬機,如下圖操作:如果是在ubuntu20.04中,還需要以下的操作: sudo mkdir /mnt/hgfs 此命令無效 sudo echo ‘vmhgfs-fuse /mnt/hgfs fu…

如何查看電腦后門IP和流量?

你是否也有以下經歷?深夜,你的電腦風扇突然狂轉,屏幕卻一片寂靜;每月流量莫名超標,賬單高得離譜;鼠標偶爾不聽使喚…這些可能不是電腦“鬧脾氣”,如何一探究竟? 想象一下&#xff1a…

分類預測 | MATLAB基于四種先進的優化策略改進蜣螂優化算法(IDBO)的SVM多分類預測

分類預測 | MATLAB基于四種先進的優化策略改進蜣螂優化算法(IDBO)的SVM多分類預測 目錄分類預測 | MATLAB基于四種先進的優化策略改進蜣螂優化算法(IDBO)的SVM多分類預測分類效果基本介紹多策略量子自適應螺旋搜索算法研究摘要1. 引言1.1 研究背景1.2 研究意義1.3 研究目標2. 文…

Android 修改系統時間源碼閱讀

鏈接:XRefAndroid - Support Android 16.0 & OpenHarmony 5.0 (AndroidXRef/AospXRef) 這里看的Android 10的代碼,選中Android 10,勾選所有工程,搜索DateTimeSettings?: 看到showTimePicker應該是顯示一個設置時…

關于自定義域和 GitHub Pages(Windows)

GitHub Pages 支持使用自定義域,或將站點 URL 的根目錄從默認值(例如 )更改為您擁有的任何域,比如octocat.github.io。 誰可以使用此功能? GitHub Pages 在公共存儲庫中提供 GitHub Free 和 GitHub Free for organizations,在公共和私有存儲庫中提供 GitHub Pro、GitHub …

自動駕駛領域中的Python機器學習

數據預處理與特征工程 在自動駕駛系統中,數據是驅動決策的核心。從傳感器(如攝像頭、激光雷達、毫米波雷達)收集的原始數據通常包含噪聲、缺失值和異常值,需要進行系統的預處理。Python的pandas庫提供了強大的數據處理能力&#x…