#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <functional>
#include <algorithm>
using namespace std;
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
char* Serialize(TreeNode *root);
void SerializeCore(TreeNode *root, string &result);
TreeNode* Deserialize(char *str);
TreeNode* DeserializeCore(char* &str);
TreeNode* KthNode(TreeNode* pRoot, int k);
TreeNode* KthNodeCore(TreeNode* pRoot, int &k);
void Insert(int num);
double GetMedian();
private:
vector<int> nums1;
vector<int> nums2;
};
char* Solution::Serialize(TreeNode *root) {
if (!root) return nullptr;
string result;
SerializeCore(root, result);
int len = result.size();
char* temp = new char[len + 1];
strcpy_s(temp, len + 1, result.c_str());
return temp;
}
void Solution::SerializeCore(TreeNode *root, string &result) {
if (!root) {
result.push_back('#');
result.push_back(',');
return;
}
result += to_string(root->val);
result.push_back(',');
SerializeCore(root->left, result);
SerializeCore(root->right, result);
return;
}
TreeNode* Solution::Deserialize(char *str) {
if (!str) return nullptr;
TreeNode* result = DeserializeCore(str);
return result;
}
TreeNode* Solution::DeserializeCore(char* &str) {
if (*str == ',') str++;
if (*str == '#') {
str++;
return nullptr;
}
if (*str == '\0') return nullptr;
int temp = 0;
while (*str != ',' && *str != '\0') {
temp = 10 * temp + (*str - '0');
str++;
}
TreeNode* result = new TreeNode(temp);
result->left = DeserializeCore(str);
result->right = DeserializeCore(str);
return result;
}
TreeNode* Solution::KthNode(TreeNode* pRoot, int k) {
if (!pRoot || k <= 0) return nullptr;
return KthNodeCore(pRoot, k);
}
TreeNode* Solution::KthNodeCore(TreeNode* pRoot, int &k) {
if (!pRoot) return nullptr;
TreeNode* result = nullptr;
if (pRoot->left) {
result = KthNodeCore(pRoot->left, k);
}
if (!result) {
if (k == 1) result = pRoot;
k--;
}
if (!result && pRoot->right) {
result = KthNodeCore(pRoot->right, k);
}
return result;
}
void Solution::Insert(int num) {
if (nums1.size() > 0 && num < nums1[0]) {
if (((nums1.size() + nums2.size()) & 1) == 0) {
if (nums1.size() > 0 && nums1[0] > num) {
nums1.push_back(num);
push_heap(nums1.begin(), nums1.end(), less<int>());
num = nums1[0];
pop_heap(nums1.begin(), nums1.end(), less<int>());
nums1.pop_back();
}
nums2.push_back(num);
push_heap(nums2.begin(), nums2.end(), greater<int>());
}
else {
if (nums2.size() > 0 && nums2[0] < num) {
nums2.push_back(num);
push_heap(nums2.begin(), nums2.end(), greater<int>());
num = nums2[0];
pop_heap(nums2.begin(), nums2.end(), greater<int>());
nums2.pop_back();
}
nums1.push_back(num);
push_heap(nums1.begin(), nums1.end(), less<int>());
}
}
}
double Solution::GetMedian() {
int size = nums1.size() + nums2.size();
if (size == 0)
throw "Numbers are invalid";
double result;
if ((size & 1) == 1) result = nums2[0];
else result = ((double)(nums1[0] + nums2[0])) / 2;
return result;
}
void test1() {
TreeNode* pRoot = new TreeNode(1);
pRoot->left = new TreeNode(2);
pRoot->left->left = new TreeNode(4);
pRoot->left->right = new TreeNode(5);
pRoot->right = new TreeNode(3);
pRoot->right->left = new TreeNode(6);
pRoot->right->right = new TreeNode(7);
Solution s;
char* result = s.Serialize(pRoot);
char* temp = result;
while (*temp != '\0') {
cout << *temp;
temp++;
}
cout << endl;
TreeNode* pTemp = s.Deserialize(result);
return;
}
void test2() {
TreeNode* pRoot = new TreeNode(5);
pRoot->left = new TreeNode(3);
pRoot->left->left = new TreeNode(2);
pRoot->left->right = new TreeNode(4);
pRoot->right = new TreeNode(7);
pRoot->right->left = new TreeNode(6);
pRoot->right->right = new TreeNode(8);
Solution s;
cout << s.KthNode(pRoot, 3)->val;
return;
}
int main() {
test2();
system("pause");
return 0;
}