本文主要是介绍【leetcode面试经典150题】72. 从前序与中序遍历序列构造二叉树(C++),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C++语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致)
【题目描述】
给定两个整数数组 preorder
和 inorder
,其中 preorder
是二叉树的先序遍历, inorder
是同一棵树的中序遍历,请构造二叉树并返回其根节点。
【示例一】
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] 输出: [3,9,20,null,null,15,7]
【示例二】
输入: 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* buildTree(vector<int>& preorder, vector<int>& inorder) {this->preorder = preorder;for(int i = 0; i < inorder.size(); i++)dic[inorder[i]] = i;return recur(0, 0, inorder.size() - 1);}
private:vector<int> preorder;unordered_map<int, int> dic;TreeNode* recur(int root, int left, int right) { if (left > right) return nullptr; // 递归终止TreeNode* node = new TreeNode(preorder[root]); // 建立根节点int i = dic[preorder[root]]; // 划分根节点、左子树、右子树node->left = recur(root + 1, left, i - 1); // 开启左子树递归node->right = recur(root + i - left + 1, i + 1, right); // 开启右子树递归return node; // 回溯返回根节点}
};
这篇关于【leetcode面试经典150题】72. 从前序与中序遍历序列构造二叉树(C++)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!