diff --git a/模板/排序/归并排序.cpp b/模板/排序/归并排序.cpp new file mode 100644 index 0000000..bb2f6ac --- /dev/null +++ b/模板/排序/归并排序.cpp @@ -0,0 +1,37 @@ +#include +#include +#include +#include +using namespace std; + +void merge(vector& nums, int l, int r){ + int mid = (l + r) / 2; + int i = l, j = mid + 1; + vector tmp; + while(i <= mid && j <= r){ + if(nums[i] <= nums[j]) tmp.push_back(nums[i++]); + else tmp.push_back(nums[j++]); + } + while(i <= mid) tmp.push_back(nums[i++]); + while(j <= r) tmp.push_back(nums[j++]); + + for(int x = l; x <= r; x++){ + nums[x] = tmp[x - l]; + } +} + +void mergeSort(vector& nums, int l, int r){ + //回溯,后序 + if(l >= r) return; + int mid = (l + r) / 2; + mergeSort(nums, l, mid); + mergeSort(nums, mid + 1, r); + //合并可以写在一起,但是分开清晰 + merge(nums, l, r); +} + + +int main(){ + + return 0; +} \ No newline at end of file diff --git a/模板/树/前中建树BFS.cpp b/模板/树/前中建树BFS.cpp new file mode 100644 index 0000000..385e205 --- /dev/null +++ b/模板/树/前中建树BFS.cpp @@ -0,0 +1,72 @@ +class Solution { +public: + /** + * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 + * + * 求二叉树的右视图 + * @param preOrder int整型vector 先序遍历 + * @param inOrder int整型vector 中序遍历 + * @return int整型vector + */ + TreeNode* build( + const vector& pre, int preL, int preR, + const vector& in, int inL, int inR) +{ + if (preL > preR || inL > inR) return nullptr; + + TreeNode* root = new TreeNode(pre[preL]); + + int Search = find(in.begin() + inL, in.begin() + inR + 1, pre[preL]) - in.begin(); + int k = Search - inL; // 左子树节点数 + + root->left = build( + pre, + preL + 1, + preL + k, + in, + inL, + Search - 1 + ); + + root->right = build( + pre, + preL + k + 1, + preR, + in, + Search + 1, + inR + ); + + return root; +} + + vector solve(vector& preOrder, vector& inOrder) { + TreeNode* root = build( + preOrder, 0, preOrder.size() - 1, + inOrder, 0, inOrder.size() - 1 + ); + + vector result; + if (!root) return result; + + queue q; + q.push(root); + + while (!q.empty()) { + int sz = q.size(); // 当前层节点数 + for (int i = 0; i < sz; i++) { + TreeNode* t = q.front(); q.pop(); + + // 当前层最后一个节点 + if (i == sz - 1) { + result.push_back(t->val); + } + + if (t->left) q.push(t->left); + if (t->right) q.push(t->right); + } + } + return result; +} + +}; \ No newline at end of file