劍指offer之面試題7 重建二叉樹

2021-10-04 23:18:42 字數 1490 閱讀 9006

1、題目

輸入某二叉樹的前序遍歷和中序遍歷序列的結果,請重建該二叉樹,假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。前序遍歷序列:,中序遍歷序列:

輸入引數:前序遍歷序列、中序遍歷序列、序列的長度

輸出結果:二叉樹的根節點指標,或者為空

2、解題

首先,乙個二叉樹節點的定義如下,包括資料域和兩個指向孩子節點的指標

struct binarytreenode

;

其次,分析前序遍歷序列和中序遍歷序列。

前序遍歷序列的排列為:根節點 —— 左子樹 —— 右子樹

中序遍歷序列的排列為:左子樹 —— 根節點 —— 右子樹

所以,解題的核心步驟為:

3、魯棒性

本題目的關鍵在於提高**的魯棒性。

魯棒性(robust)的定義指程式能夠判斷輸入是否合乎規範要求,並對不符合規範的輸入進行合理的處理

提高**魯棒性的方法:防禦性程式設計

防禦性程式設計的定義指遇見在什麼地方出現問題,並為這些可能的問題制定處理方式

本題需要考慮三個地方

4、完整**

binarytreenode*

construct

(int

* preorder,

int* inorder,

int length)

binarytreenode* constructcore

(int

* startpreorder,

int* endpreorder,

int* startinorder,

int* endinorder

)//開始編寫核心**

int* rootinorder = startinorder;

while

(rootinorder <= endinorder &&

*rootinorder != rootvalue)

rootinorder++

;//第三次魯棒性判斷

if(rootinorder > endinorder)

throw std:

:exception

("invalid input.");

int leftlength = rootinorder - startinorder;

int* leftpreorderend = startpreorder + leftlength;

//開始構建左子樹和右子樹

if(leftlength >0)

if(leftlength < endpreorder - startpreorder)

//最後返回根節點

return root;

}

5、注意點

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

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。class solution struct treenode reconstruct int l1,int r1,int l2 pr...

劍指Offer 面試題7 重建二叉樹

題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹,假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如,輸入前序遍歷序列和中序遍歷,則重建如圖2.6所示的二叉樹並輸出它的頭節點。分析 前序遍歷 先根,再左,後右 中序遍歷 先左,再根,後右。那麼前序遍歷的第乙個是根,在中序遍歷中找到...

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

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建出二叉樹並輸出他的根節點。二叉樹的定義如下 public static class binarytreenode 在二叉樹的前序遍歷中,第乙個數字總...