樹 一些關於樹的面試題

2021-06-20 15:17:35 字數 1644 閱讀 9456

之前講了樹,也講了其基本的操作。現在看看關於樹的一些面試題

面試題:重建二叉樹

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷序列和中序遍歷序列,則重建出圖2.6所示的二叉樹並輸出它的頭結點。二叉樹結點的定義如下:

struct binary tree node

這題就是間接考查遍歷了,所以我們一定要把3種遍歷的6種實現方法都瞭如指掌。

根據定義,先序遍歷首先遍歷的是根結點,所以先序序列中,第乙個結點一定是二叉樹的根結點。但在中序遍歷序列中,根結點的值在序列的中間,左子樹的結點的值位於根結點的值的左邊,而右子樹的結點的值位於根結點的值的右邊。所以,根結點在中序序列中必然將中序序列分割成兩個子串行,前乙個子串行是根結點的左子樹的中序序列,而後乙個子串行是根結點的右子樹的中序序列。如此類推。

思路出來的,接下來要怎樣寫呢?不如先看看二叉樹是怎樣建立的吧。

void createbitree(bitree &t)

有了上面的**在一步步地寫出重建二叉樹的**

typedef struct _treenode

treenode;

/*函式名稱:pre_mid_tree

函式功能:給定二叉樹的先序與中序序列,建立二叉樹。

輸入引數: treenode *tree:二叉樹的結點tree

char pre:儲存了二叉樹的先序序列的字元陣列

char mid:儲存了二叉樹的中序序列的字元陣列

int lp, int rp:二叉樹的先序序列在陣列pre中的左右邊界

int lm, int rm:二叉樹的中序序列在陣列mid中的左右邊界

*/treenode * pre_mid_tree(treenode *tree, char pre, char mid,

int lp, int rp, int lm, int rm)

同樣的道理,由二叉樹的後序序列和中序序列也可唯一地確定一棵二叉樹。因為,依據後序遍歷和中序遍歷的定義,後序序列的最後乙個結點,就如同先序序列的第乙個結點一樣,可將中序序列分成兩個子串行,分別為這個結點的左子樹的中序序列和右子樹的中序序列,再拿出後序序列的倒數第二個結點,並繼續分割中序序列,如此遞迴下去,當倒著取取盡後序序列中的結點時,便可以得到一棵二叉樹。

/*

函式名稱:post_mid_tree

函式功能:給定二叉樹的後序與中序序列,建立二叉樹。

輸入引數: treenode *tree:二叉樹的結點tree

char post:儲存了二叉樹的後序序列的字元陣列

char mid:儲存了二叉樹的中序序列的字元陣列

int lp, int rp:二叉樹的後序序列在陣列post中的左右邊界

int lm, int rm:二叉樹的中序序列在陣列mid中的左右邊界

*/treenode * post_mid_tree(treenode *tree, char post, char mid,

int lp, int rp, int lm, int rm)

未完。。

參考:劍指offer面試題6:重建二叉樹

關於JDBC的一些面試題

1.statement prestatement有什麼區別 解答 後者的效率比前者高,在使用preparedstatement物件執行sql命令時,命令被資料庫進行編譯和解析,然後被放到命令緩衝區。然後,每當執行同乙個preparedstatement物件時,它就會被再解析一次,但不會被再次編譯。在...

一些面試題(關於string的)

一些常見的面試題 string a hello2 string b hello 2 system.out.println a b a b輸出true。很明顯b在編譯時就被優化成 hello2 因此在執行期間,a和b指向的是統一物件 string a hello2 string b hello str...

關於redis的一些面試題

一.使用redis有哪些好處?1.速度快,因為資料是存在記憶體中的。2.支援豐富的資料型別,string,list,set,sorted set,hash 3.支援事務,操作都有原子性,也就是對陣列的更改要麼不執行,要麼全部執行。4.豐富的特性 可用於快取,訊息,按key設定過期時間,過期後自動刪除...