From 65e20aa30a540b8259a5c3fc1e3a6b916a998c77 Mon Sep 17 00:00:00 2001 From: Eat-Swap Date: Thu, 14 Jul 2022 23:30:08 +0800 Subject: [PATCH] add: 220714 --- cpp/2207/220714.cpp | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 cpp/2207/220714.cpp diff --git a/cpp/2207/220714.cpp b/cpp/2207/220714.cpp new file mode 100644 index 0000000..302353c --- /dev/null +++ b/cpp/2207/220714.cpp @@ -0,0 +1,36 @@ +#include +#include + +struct TreeNode { + int val; + TreeNode* left; + TreeNode* right; + explicit TreeNode(int x, TreeNode* left = nullptr, TreeNode* right = nullptr) : val(x), left(left), right(right) {} +}; + +/** + * 105. Construct Binary Tree from Preorder and Inorder Traversal + * Given two integer arrays preorder and inorder where preorder is the preorder traversal of a binary tree and inorder is the inorder traversal of the same tree, construct and return the binary tree. + */ + +class Solution { +private: + TreeNode* buildTree(std::vector::const_iterator preBegin, std::vector::const_iterator preEnd, std::vector::const_iterator inBegin, std::vector::const_iterator inEnd) { + if (preBegin == preEnd) + return nullptr; + if (std::next(preBegin) == preEnd) + return new TreeNode(*preBegin); + auto midIt = std::find(inBegin, inEnd, *preBegin); + auto lenL = std::distance(inBegin, midIt); + return new TreeNode( + *preBegin, + buildTree(preBegin + 1, preBegin + 1 + lenL, inBegin, midIt), + buildTree(preBegin + 1 + lenL, preEnd, midIt + 1, inEnd) + ); + } + +public: + TreeNode* buildTree(const std::vector& preorder, const std::vector& inorder) { + return buildTree(preorder.begin(), preorder.end(), inorder.begin(), inorder.end()); + } +}; \ No newline at end of file