已知BST的前序遍历数组重建BST
#include <iostream>
#include <vector>
using namespace std;
struct TreeNode {
TreeNode* left;
TreeNode* right;
int date;
TreeNode(int value) :
date(value), left(nullptr), right(nullptr)
{
}
};
void preTraversal(TreeNode* root) {
if (root == nullptr) {
return;
}
cout << root->date << " ";
preTraversal(root->left);
preTraversal(root->right);
delete root;
}
TreeNode* buildBSTree(vector<int>& pre, int left, int right) {
if (pre.empty() || left < 0 || right < 0 || right < left) {
return nullptr;
}
int mid = left + 1;
while (mid <= right && pre.at(mid) < pre.at(left)) {
mid++;
}
TreeNode* root = new TreeNode(pre.at(left));
root->left = buildBSTree(pre, left + 1, mid - 1);
root->right = buildBSTree(pre, mid, right);
return root;
}
int main() {
vector<int> pre{
5, 2, 1, 3, 8, 7, 9 };
TreeNode* root = buildBSTree(pre, 0, pre.size() - 1);
preTraversal(root);
cout << endl;
system("pause");
return 0;
}
时间复杂度:
- 最差情况:O(N^2)
- 最好情况:O(N*logN)
已知BST的后序遍历数组重建BST
#include <iostream>
#include <vector>
using namespace std;
struct TreeNode {
TreeNode* left;
TreeNode* right;
int date;
TreeNode(int value) :
date(value), left(nullptr), right(nullptr)
{
}
};
void postTraversal(TreeNode* root) {
if (root == nullptr) {
return;
}
postTraversal(root->left);
postTraversal(root->right);
cout << root->date << " ";
delete root;
}
TreeNode* buildBSTree(vector<int>& post, int left, int right) {
if (post.empty() || right < 0 || left < 0 || right < left) {
return nullptr;
}
int mid = left;
while (post.at(mid) < post.at(right)) {
mid++;
}
TreeNode* root = new TreeNode(post.at(right));
root->left = buildBSTree(post, left, mid - 1);
root->right = buildBSTree(post, mid, right - 1);
return root;
}
int main() {
vector<int> post{
1, 3, 2, 7, 9, 8, 5 };
TreeNode* root = buildBSTree(post, 0, post.size() - 1);
postTraversal(root);
cout << endl;
system("pause");
return 0;
}
时间复杂度:
- 最差情况:O(N^2)
- 最好情况:O(N*logN)
如有侵权,请联系删除,如有错误,欢迎大家指正,谢谢