El preorder (o postorder) del árbol de búsqueda binario conocido (BST) atraviesa la matriz para reconstruir el BST (versión mejorada)

Conozca el pedido anticipado de BST para atravesar la matriz para reconstruir 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;
}

Complejidad de tiempo: O (N * logN)

Se sabe que el orden posterior de BST atraviesa la matriz para reconstruir 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;
}

Complejidad de tiempo: O (N * logN)

Si hay alguna infracción, comuníquese para eliminarla. Si hay un error, corríjame, gracias

Supongo que te gusta

Origin blog.csdn.net/xiao_ma_nong_last/article/details/105669633
Recomendado
Clasificación