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 在二叉樹的前序遍歷中,第乙個數字總...