《劍指Offer》面試題6 重建二叉樹 勘誤

2022-03-26 04:46:00 字數 710 閱讀 6796

感覺是個小bug:

// 在中序遍歷中找到根結點的值

int* rootinorder = startinorder;

while(rootinorder <= endinorder && *rootinorder != rootvalue)

++ rootinorder;

if(rootinorder == endinorder && *rootinorder != rootvalue)

throw std::exception("invalid input.");

下面的if判斷,其初衷是,如果在中序中沒有找到根結點,報錯。

例如:輸入的前序是:

輸入的中序是:

根結點1,在中序中查詢,一直查到中序陣列的末尾也沒找到。按上面的邏輯,是rootinorder一直取到了8。

在if判斷中,rootinorder == endinorder,rootinorder 的位址已經越出了陣列的界,後面的判斷條件不會使用。按理說第乙個根結點就找不到,就會直接報異常,終止程式。

但按原文的**,會繼續下面的構建子樹。

其實也就乙個小bug,改動如下:

//如果在中序序列中沒找到前序中對應的根結點

if(rootinorder > endinorder )

throw std::exception("invalid input.");

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

題目 輸入某二叉樹的前序遍歷和中序遍歷,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含有重複的數字。例如,前序遍歷序列 1,2,4,7,3,5,6,8 中序遍歷序列 4,7,2,1,5,3,8,6 則重建出的二叉樹如下所示,並輸出它的頭結點1。基本思想 前序遍歷 前序遍歷首先訪問根結點...

劍指offer《面試題6 重建二叉樹》

題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建出下圖所示的二叉樹並輸出它的頭結點。1 2 3 4 5 6 7 8 劍指offer 名企面試官精講典型程式設計題 著作權所有者 何海濤 inc...

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

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。重建出二叉樹,並輸出根節點。二叉樹的定義如下 如上,前序遍歷 1,2,4,7,3,5,6,8,中序 4,7,2,1,5,3,8,6,後序遍歷 7,4,2,5,8,6,3,1 在二叉樹的前序...