diff --git a/1038-231204-pass/main.cpp b/1038-231204-pass/main.cpp new file mode 100644 index 0000000..b1de922 --- /dev/null +++ b/1038-231204-pass/main.cpp @@ -0,0 +1,125 @@ +#include +using namespace std; + +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: + priority_queue, greater > vals; + int cnt = 0; + void traverse(TreeNode * node){ + vals.push(node->val); + cnt++; + if(node->left!=nullptr) traverse(node->left); + if(node->right!=nullptr) traverse(node->right); + } + TreeNode* bstToGst(TreeNode* root) { + traverse(root); + int val[110]; + int idx[110]; + int pref[110],sum=0; + for(int i = 0 ; i < cnt ; i++){ + val[i] = vals.top(); + vals.pop(); + if(i==0) + pref[i] = val[i]; + else{ + pref[i] = pref[i-1] + val[i]; + } + } + sum = pref[cnt-1]; + for(int i = 0 ; i < cnt ; i++){ + idx[val[i]] = sum - pref[i]; + } + stack sta; + sta.push(root); + while(sta.empty() == false){ + TreeNode* top_node = sta.top(); + cout<<"top_node is "<val<left!=nullptr) sta.push(top_node->left); + if(top_node->right!=nullptr) sta.push(top_node->right); + top_node->val+=idx[top_node->val]; + } + cnt = 0; + std::priority_queue, std::greater> empty; + vals.swap(empty); + return root; + } +}; + +void create(int * val, int cnt, TreeNode *cur,int idx){ + int left_idx = (idx + 1) * 2 - 1; + int right_idx = (idx + 1) * 2 ; + if(left_idx > cnt){ + cur->left = nullptr; + cur->right = nullptr; + return; + } + if(right_idx > cnt){ + cur->right = nullptr; + return; + } + if(val[left_idx] == -1){ + cur -> left = nullptr; + }else{ + TreeNode * left_child = new TreeNode(val[left_idx]); + cur->left = left_child; + create(val,cnt,left_child,left_idx); + } + if(val[right_idx] == -1){ + cur -> right = nullptr; + }else{ + TreeNode * right_child = new TreeNode(val[right_idx]); + cur->right = right_child; + create(val, cnt, right_child, right_idx); + } + return; +} +void traverse(TreeNode* node){ + cout<val<<' '; + if(node->left != nullptr){ + traverse(node->left); + } + if(node->right != nullptr){ + traverse(node->right); + } + return; +} +TreeNode* createTree(int * val, int cnt){ + TreeNode * root = new TreeNode(val[0]); + cout<<"create a tree"<