?目錄鏈接:
力扣編程題-解法匯總_分享+記錄-CSDN博客
GitHub同步刷題項(xiàng)目:
https://github.com/September26/java-algorithms
原題鏈接:
力扣(LeetCode)官網(wǎng) - 全球極客摯愛的技術(shù)成長平臺
描述:
給定兩個(gè)整數(shù)數(shù)組?inorder
?和?postorder
?,其中?inorder
?是二叉樹的中序遍歷,?postorder
?是同一棵樹的后序遍歷,請你構(gòu)造并返回這顆?二叉樹?。
示例 1:
輸入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3] 輸出:[3,9,20,null,null,15,7]
示例 2:
輸入:inorder = [-1], postorder = [-1] 輸出:[-1]
提示:
1 <= inorder.length <= 3000
postorder.length == inorder.length
-3000 <= inorder[i], postorder[i] <= 3000
-
inorder
?和?postorder
?都由?不同?的值組成 -
postorder
?中每一個(gè)值都在?inorder
?中 -
inorder
?保證是樹的中序遍歷 -
postorder
?保證是樹的后序遍歷
解題思路:
1.和105題差不多,只不過后序遍歷的最后一個(gè)數(shù)字,一定是根節(jié)點(diǎn)。中序遍歷中找到這個(gè)根節(jié)點(diǎn),就可以分成左右兩份,分別對應(yīng)左子樹和右子樹。文章來源:http://www.zghlxwxcb.cn/news/detail-836993.html
2.所以我們使用和105題一樣的策略,唯一要改的就是傳入的區(qū)間范圍。文章來源地址http://www.zghlxwxcb.cn/news/detail-836993.html
代碼:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder)
{
vector<int> indexMap(6000);
for (int i = 0; i < inorder.size(); i++)
{
indexMap[inorder[i] + 3000] = i;
}
TreeNode *node = buildNode(indexMap, postorder, inorder, 0, postorder.size() - 1, 0, inorder.size() - 1);
return node;
}
TreeNode *buildNode(vector<int> &indexMap, vector<int> &postorder, vector<int> &inorder, int postStart, int postEnd, int inStart, int inEnd)
{
int expectValue = postorder[postEnd];
int index = indexMap[expectValue+3000];
int leftLength = index - inStart;
int rightLength = inEnd - index;
TreeNode *root = new TreeNode(expectValue);
if (leftLength >= 1)
{
root->left = buildNode(indexMap, postorder, inorder, postStart, postStart + leftLength - 1, inStart, index - 1);
}
if (rightLength >= 1)
{
root->right = buildNode(indexMap, postorder, inorder, postEnd - rightLength, postEnd - 1, index + 1, inEnd);
}
return root;
}
};
到了這里,關(guān)于?LeetCode解法匯總106. 從中序與后序遍歷序列構(gòu)造二叉樹的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!