持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
本文已参与[新人创作礼]活动,一起开启掘金创作之路
题目链接(105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode))
思路:
1.从前序第一个可得知是树节点,可以凭借此得出分割点
2.树节点得知后可以将中序遍历的数组分为左右两部分。
3.又因为中序树组的长度和后序数组的长度一样,又可以凭借长度将前序数组分割成左右两部分。
给定两个整数数组 inorder 和 preorder ,其中 inorder 是二叉树的中序遍历, preorder 是同一棵树的前序遍历,请你构造并返回这颗 二叉树 。
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] 输出: [3,9,20,null,null,15,7] 示例 2:
输入: preorder = [-1], inorder = [-1] 输出: [-1]
提示:
1 <= preorder.length <= 3000 inorder.length == preorder.length -3000 <= preorder[i], inorder[i] <= 3000 preorder 和 inorder 均 无重复 元素 inorder 均出现在 preorder preorder 保证 为二叉树的前序遍历序列 inorder 保证 为二叉树的中序遍历序列
class Solution {
public:
TreeNode *reversal(vector<int> &preorder, vector<int> &inorder) {
if (preorder.size() == 0) return nullptr;
//如果空的话直接返回并不用执行以下条件。
int value = preorder[0];
TreeNode*root = new TreeNode(value);
//找分割点
int index;
for (index = 0; index < inorder.size(); index++) {
if (inorder[index] == value)break;
}
//中序数组根据下标分为左右两部分
vector<int> leftinorder(inorder.begin(), inorder.begin() + index);
vector<int> rightinorder(inorder.begin() + index + 1, inorder.end());
//前序数组根据和中序数组的长度一样分为左右两部分
vector<int> leftpreorder(preorder.begin() + 1, preorder.begin() + 1 + leftinorder.size());
vector<int> rightpreorder(preorder.begin() + 1 + leftinorder.size(), preorder.end());
root->left = reversal(leftpreorder, leftinorder);
root->right = reversal(rightpreorder, rightinorder);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if (preorder.size() == 0 || inorder.size() == 0) return nullptr;
//为空直接返回了
return reversal (preorder, inorder);
}
};