輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。給出遍歷序列唯一確定二叉樹有兩種方式:
前序遍歷 + 中序遍歷
後序遍歷 + 中序遍歷
這道題中給出了前序遍歷序列和中序遍歷序列,要求重建二叉樹。
我們知道前序遍歷的順序是:根->左->右,而中序遍歷的順序是:左->根->右。以題目給出的例子,簡單分析一下。
前序遍歷序列的第一項是 「1」,是樹的根結點,對應中序遍歷序列的第 4 項,即 vin[3]。可知,中序遍歷中,「1」 左側的都是根結點 「1」 的左子樹結點,而 「1」 右側的都是根結點 「1」 的右子樹結點。
同樣地,我們看前序遍歷序列的第二項 「2」。在中序遍歷序列中 「2」 的左側有 「4」 和 「7」,說明這兩個都是結點 「2」 的左子樹孩子,而 「2」 的後側除了根節點 「1」,沒有其他數,說明 「2」 沒有右子樹。
簡單地畫了個圖,上面是前序遍歷序列,下面是中序遍歷序列。中序遍歷序列中結點 「1」 上面分析過,不重複了。同樣地,根結點 「3」 在中序遍歷序列中,在它左側的除了它的父結點以外的數,都是它的左子樹結點數值;而在它後側的都是它的右子樹結點。
分析完重建原理後,考慮到這是樹,最常用的方法是遞迴。採用遞迴的方法實現,就需要找到遞迴的兩個要素。按照上述分析,我們知道,首先找到 「根結點」 在中序遍歷序列中的位置,然後就可以劃分這個 「根結點」 的左右子樹結點。左右子樹結點分別對應著兩個「縮短」了的序列,然後又繼續找 「根節點」 劃分左右子樹結點,如此類推,直至這個 「根結點」 沒有左右子樹,說明到達葉子結點。所以遞迴結束條件就是當前序或者中序遍歷序列被縮短到沒有了,就返回 null,表示所有結點都建立好了。遞迴公式則是找到 「根節點」,然後構建左、右子樹。
實現**:
/**
* definition for binary tree
* struct treenode
* };
*/class
solution
treenode*
constructnode
(vector<
int>
pre,
int startpre,
int endpre,vector<
int>
in,int startin,
int endin)
treenode* root =
newtreenode
(pre[startpre]);
for(
int i=startin;i<=endin;i++)}
return root;}}
;
劍指offer 重建二叉樹
重建二叉樹2.cpp 定義控制台應用程式的入口點。題目描述 輸入乙個二叉樹的前序遍歷和中序遍歷,輸出這顆二叉樹 思路 前序遍歷的第乙個節點一定是這個二叉樹的根節點,這個節點將二叉樹分為左右子樹兩個部分,然後進行遞迴求解 include stdafx.h include vector using na...
《劍指offer》重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如,則重建二叉樹並返回。輸入乙個樹的前序和中序,例如輸入前序遍歷序列和中序遍歷序列 根據輸入的前序和中序,重建乙個該二叉樹,並返回該樹的根節點。definition for binary...
劍指offer 重建二叉樹
題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。definition for binary tree struct treenode class solution if ...