From a8500d5c1bc11f7abb7b074139a21d64d687e990 Mon Sep 17 00:00:00 2001 From: Youngsang Suh <60172447+youngsangsuh@users.noreply.github.com> Date: Fri, 19 May 2023 17:02:25 -0700 Subject: [PATCH 1/2] [105] ysuh solution --- Leetcode/105/ysuh/solution.cpp | 78 ++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 Leetcode/105/ysuh/solution.cpp diff --git a/Leetcode/105/ysuh/solution.cpp b/Leetcode/105/ysuh/solution.cpp new file mode 100644 index 0000000..c3bdc8d --- /dev/null +++ b/Leetcode/105/ysuh/solution.cpp @@ -0,0 +1,78 @@ +/** + * 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 root; + TreeNode* root_pointer = &root; + + int findRight(int pivot, vector& preorder, vector& inorder) { + int start_idx = 2; + while (true) { + if (start_idx == preorder.size()) return -1; + for (int idx=0; idx& preorder, vector& inorder) { + + // parent->val = preorder[0]; + // parent->val = 0; + // if (preorder.size() > 1) { + // for (int i=0; ileft = &left; + // if (preorder.size() > 2) { + // int right_idx = findRight(preorder[0], preorder, inorder); + // if (right_idx == -1) { + // parent->right = NULL; + // } else { + // TreeNode right(preorder[right_idx]); + // parent->right = &right; + // } + // } else { + // parent->right = NULL; + // } + // preorder.erase(preorder.begin()); + // inorder.erase(inorder.begin()+i); + // } + // if (preorder[0] == inorder[i]) { + // parent->left = NULL; + // TreeNode right(preorder[1]); + // parent->right = &right; + // preorder.erase(preorder.begin()); + // inorder.erase(inorder.begin()+i); + // break; + // } + // } + // } + // if (parent->left != NULL) { + // traverseTree(parent->left, preorder, inorder); + // } + // if (parent->right != NULL) { + // traverseTree(parent->right, preorder, inorder); + // } + return parent; + } + + TreeNode* buildTree(vector& preorder, vector& inorder) { + traverseTree(root_pointer, preorder, inorder); + return root_pointer; + } +}; From acbf7c1d8291f82af6f5346a4d3f3f4aea2dcc52 Mon Sep 17 00:00:00 2001 From: Youngsang Suh <60172447+youngsangsuh@users.noreply.github.com> Date: Wed, 24 May 2023 15:54:49 -0700 Subject: [PATCH 2/2] Update solution.cpp --- Leetcode/105/ysuh/solution.cpp | 75 ++++++++-------------------------- 1 file changed, 16 insertions(+), 59 deletions(-) diff --git a/Leetcode/105/ysuh/solution.cpp b/Leetcode/105/ysuh/solution.cpp index c3bdc8d..4faa8a3 100644 --- a/Leetcode/105/ysuh/solution.cpp +++ b/Leetcode/105/ysuh/solution.cpp @@ -11,68 +11,25 @@ */ class Solution { public: - TreeNode root; - TreeNode* root_pointer = &root; - - int findRight(int pivot, vector& preorder, vector& inorder) { - int start_idx = 2; - while (true) { - if (start_idx == preorder.size()) return -1; - for (int idx=0; idx val_idx_map; + int idx = 0; + TreeNode* find(vector& preorder, vector& inorder, int left, int right) { + if (left > right) { + return nullptr; } - } - TreeNode* traverseTree(TreeNode* parent, vector& preorder, vector& inorder) { - - // parent->val = preorder[0]; - // parent->val = 0; - // if (preorder.size() > 1) { - // for (int i=0; ileft = &left; - // if (preorder.size() > 2) { - // int right_idx = findRight(preorder[0], preorder, inorder); - // if (right_idx == -1) { - // parent->right = NULL; - // } else { - // TreeNode right(preorder[right_idx]); - // parent->right = &right; - // } - // } else { - // parent->right = NULL; - // } - // preorder.erase(preorder.begin()); - // inorder.erase(inorder.begin()+i); - // } - // if (preorder[0] == inorder[i]) { - // parent->left = NULL; - // TreeNode right(preorder[1]); - // parent->right = &right; - // preorder.erase(preorder.begin()); - // inorder.erase(inorder.begin()+i); - // break; - // } - // } - // } - // if (parent->left != NULL) { - // traverseTree(parent->left, preorder, inorder); - // } - // if (parent->right != NULL) { - // traverseTree(parent->right, preorder, inorder); - // } + int i_idx = val_idx_map[preorder[idx]]; + TreeNode* parent = new TreeNode(preorder[idx]); + idx++; + parent->left = find(preorder, inorder, left, i_idx-1); + parent->right = find(preorder, inorder, i_idx+1, right); return parent; } - TreeNode* buildTree(vector& preorder, vector& inorder) { - traverseTree(root_pointer, preorder, inorder); - return root_pointer; + int idx = 0; + for (auto ele : inorder) { + val_idx_map[ele] = idx; + idx++; + } + return find(preorder, inorder, 0, inorder.size()-1); } };