The preorder (or postorder) of the known binary search tree (BST) traverses the array to reconstruct the BST (improved version)

Know the preorder of BST to traverse the array to reconstruct 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;
	int tmpL = mid;
	int tmpR = right;
	/* 二分查找 */
	while (tmpL < tmpR) {
    
    
		int tmpMid = tmpL + ((tmpR - tmpL) >> 1);
		if (pre.at(left) > pre.at(tmpMid)) {
    
    
			tmpL = tmpMid + 1;
		}
		else {
    
    
			mid = tmpMid;
			tmpR = tmpMid - 1;
		}
	}
	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;
}

Time complexity: O(N*logN)

It is known that the post-order of BST traverses the array to reconstruct 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 = right;
	int tmpL = left;
	int tmpR = mid - 1;
	/* 二分查找 */
	while (tmpL < tmpR) {
    
    
		int tmpMid = tmpL + ((tmpR - tmpL) >> 1);
		if (post.at(right) > post.at(tmpMid)) {
    
    
			tmpL = tmpMid + 1;
		}
		else {
    
    
			mid = tmpMid;
			tmpR = tmpMid - 1;
		}
	}
	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;
}

Time complexity: O(N*logN)

If there is any infringement, please contact to delete it. If there is an error, please correct me, thank you

Guess you like

Origin blog.csdn.net/xiao_ma_nong_last/article/details/105669633