資料結構小作業 廣義表輸入二叉樹

2021-09-29 05:45:11 字數 2254 閱讀 4440

測試用例

總結注意

廣義表輸入二叉樹,「#」表示空樹

a(b(d,e),c(f,#))

老規矩,舉幾個例子分析下。

建立左子樹之前,要輸入乙個"(",遇到「,」表示輸入結束

建立右子樹之前,要輸入乙個「,」,遇到「)」表示輸入結束

遇到#表示是空樹。

怎麼建立?遞迴?狀態轉換機?這裡用狀態轉換機不能做吧?因為有好多節點啊,要怎麼儲存?那就用遞迴吧,不過每次還得把節點的孩子找出來,就是提取出()中的內容來傳遞下去。

試著用遞迴來做:

所以輸入的可能情況

大寫字母()

#,

觀察發現,每個大寫字母或者#後面跟著或者

遞迴結構為a(x,y)(x,y為子樹)或者a

若是第一種結構,那麼對他的左右子樹進行建立,若是第二種結構,

每次遞迴時,先看第乙個字元是什麼,然後看他後面的字元是什麼,這樣能判斷遞迴結構是什麼,進而判斷下一步怎麼做。

第乙個字元之後,有以下幾種情況

1.( ——>說明這個遞迴結構是a(x,y)

2. ,或者 )——>說明這個遞迴結構是a

還有一種特殊情況就是,可能乙個字母後面跟著兩個符號。比如a(b(d,e),c(f,#))這樣的話進行下一步之前需要把那個「,」讀入,不要影響下一步。

void

create

(nodeptr &a)

if(ch ==

'#')

else

else

//說明結構為a

}}

#include

#include

#include

using

namespace std;

typedef

struct nodenode,

*nodeptr;

void

create

(nodeptr &a)

;//建立一棵二叉樹

void

destroy

(nodeptr a)

;//刪除二叉樹

void

print

(nodeptr a)

;//列印

intmain()

void

create

(nodeptr &a)

*/if

(ch ==

'#')

else

else

//說明結構為a }}

void

destroy

(nodeptr a)

else

}void

print

(nodeptr a)

else}/*

1.a(b(d,e),c(f,#))

abd e cf |

2.# |

3.a(#,b)

a b |

4. a(b,#)

ab |

*/

/*

1.a(b(d,e),c(f,#))

abd e cf |

2.# |

3.a(#,b)

a b |

- a(b,#)

ab |

*/

上面的思路邊想邊寫的,感覺,emmm,亂七八糟,這裡再寫乙個。

舉幾個例子觀察一下廣義表輸入的特徵,發現:

步驟:特殊情況:需要先判斷字元是不是,,若是,則無效,需要再讀乙個

1.判斷是不是空樹。若是空樹,給傳入的指標賦值null,否則繼續準備判斷遞迴結構

2.通過該字元的下乙個字元來判斷遞迴結構。

若下乙個是則為a結構,賦值之後return

若下乙個是(則為a(b,c)結構,需要遞迴建立其左子樹,右子樹。

不要忘記給空指標賦值null啊!!!

資料結構OJ作業 二叉樹

題目傳送門 tree recovery 給出乙個二叉樹的前序和中序,求二叉樹的後序。節約空間,並不實際建樹,而是一邊搜尋一邊輸出。同hdoj1710,寫完了這篇blog才發現以前也寫過,尷尬 include include using namespace std char pre 30 in 30 ...

資料結構 二叉樹 反轉二叉樹

include using namespace std define maxsize 1000 struct binary tree node class queue queue queue void queue push binary tree node btn binary tree node ...

《資料結構》 二叉樹

二叉樹 是 n個結點的有限集,它或為空集,或由乙個根結點及兩棵互不相交的 分別稱為該根的左子樹和右子樹的二叉樹組成。二叉樹不是樹的特殊情況,這是兩種不同的資料結構 它與無序樹和度為 2的有序樹不同。二叉樹的性質 1 二叉樹第 i層上的結點數最多為 2 i 1 2 深度為 k的二叉樹至多有 2 k 1...