106.从中序与后序遍历序列构造
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
本文已参与[新人创作礼]活动,一起开启掘金创作之路
题目链接106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)
思路:
1.从后序最后一个可得知是树节点,可以凭借此得出分割点
2.树节点得知后可以将中序遍历的数组分为左右两部分。
3.又因为中序树组的长度和后序数组的长度一样,又可以凭借长度将后序数组分割成左右两部分。
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
示例 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 中每一个值都在 inorder 中 inorder 保证是树的中序遍历 postorder 保证是树的后序遍历
# 代码:
class Solution {
public:
TreeNode*reversal(vector<int>& inorder, vector<int>& postorder) {
if (inorder.size() == 0) return nullptr;
int value = postorder[postorder.size() - 1];
TreeNode*root = new TreeNode(value);
//找出中序树组的切割点
int index;
for (index = 0; index <= inorder.size() - 1; index++) {
if (inorder[index] == value) break;
}
//中序数组根据下标分为左右两部分
vector<int> leftinorder(inorder.begin(), inorder.begin() + index);
vector<int> rightinorder(inorder.begin() + index + 1, inorder.end());
postorder.resize(postorder.size() - 1);
//后序数组根据和中序数组的长度一样分为左右两部分
vector<int> leftpostorder(postorder.begin(), leftinorder.size() + postorder.begin());
vector<int> rightpostorder(postorder.begin() + leftinorder.size() ,postorder.end());
root->left = reversal(leftinorder, leftpostorder);
root->right = reversal(rightinorder,rightpostorder);
return root;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if (inorder.size() == 0 || postorder.size() == 0) return nullptr;
return reversal(inorder, postorder);
}
};