1. 程式人生 > 其它 >圖解從中序與後序遍歷序列構造二叉樹

圖解從中序與後序遍歷序列構造二叉樹

技術標籤:力扣學習筆記二叉樹資料結構演算法leetcodec++

題目:

根據一棵樹的中序遍歷與後序遍歷構造二叉樹。 注意: 你可以假設樹中沒有重複的元素。 例如,給出 中序遍歷 inorder =[9,3,15,20,7] 後序遍歷 postorder = [9,15,7,20,3] 返回如下的二叉樹: 3 / \ 920 /\ 157 連結: https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal

思路:


這兩個表格是中序和後序的遍歷陣列,我們定義 inorder在閉區間[inStart,inEnd]內, postorder在閉區間[poStart,poEnd]內。 第一步:先找到根節點,由後序遍歷可知根節點是後序遍歷陣列中的最後一個元素,在上圖中標出,記根節點值rootVal為 postorder[poEnd] 第二步,找到根節點值在中序遍歷陣列中的位置,記為index,使 inorder[index] == rootVal,如下圖所示 第三步:可以找到左子樹在陣列中的長度,如下圖所示: 由上述可知:9為根節點的左子樹,15,20,7節點為根節點的右子樹的節點,這是需要找到右子樹的根節點,然後去找到右子樹的左子樹和右子樹的右子樹來構造根節點下的右子樹。 於是我們在15,20,7中重複上述的一二三步,如下圖所示:

所以我們根據上述的分析步驟去遞迴實現程式碼,如下所示。

程式碼:

class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
return buildHelp(inorder,0,inorder.size()-1,postorder,0,postorder.size()-1);
}
TreeNode *buildHelp(vector<int>& inorder,int inStart,int inEnd, vector<int>& postorder,int poStart,int poEnd)
{
if (inStart > inEnd)
{
return nullptr;
}
int rootVal = postorder[poEnd];
int index = 0;
for (int i = inStart; i <= inEnd; i++)
{
if (inorder[i] == rootVal)
{
index = i;
break;
}
}
int leftSize = index - inStart;
TreeNode* root = new TreeNode(rootVal);
root->left = buildHelp(inorder, inStart, index - 1,postorder, poStart, poStart + leftSize - 1);
root->right = buildHelp(inorder, index + 1, inEnd,postorder, poStart + leftSize, poEnd - 1);
return root;
}
};