二叉树查找树的基本操作

#include<iostream>
#include<vector>
struct BstTreeNode;
typedef struct BstTreeNode Tree;
typedef int ElemType;
struct BstTreeNode {
	ElemType element;
	Tree*    rchlid;
	Tree*    lchild;
};

Tree* Find(Tree* &Bst, ElemType X) {
	if (Bst->element < X)
		Bst->rchlid = Find(Bst->rchlid, X);
	else if (Bst->element > X)
		Bst->lchild = Find(Bst->lchild, X);
	else
		return Bst;
}


Tree* GetParentNode(Tree* &Bst, ElemType X) {
	Tree* parent = nullptr;
	if (Bst->lchild != nullptr || Bst->rchlid != nullptr) {
		if (Bst->lchild->element == X || Bst->rchlid->element == X) {
			parent = Bst;
			return parent;
		}

		Bst->lchild = GetParentNode(Bst->lchild, X);
		Bst->rchlid = GetParentNode(Bst->rchlid, X);
	}

}
Tree* FindMin(Tree* &Bst) {
	if (Bst != nullptr)
		while (Bst->lchild != nullptr)
			Bst = Bst->lchild;

	return Bst;
}

Tree* FindMax(Tree* &Bst) {
	if (Bst != nullptr)
		while (Bst->rchlid != nullptr)
			Bst = Bst->rchlid;

	return Bst;
}

void Insert(Tree* &Bst, ElemType X) {
	if (Bst == nullptr) {
		Bst = new Tree;
		Bst->element = X;
		Bst->lchild = Bst->rchlid = nullptr;
	}
	else {
		if (Bst->element > X)
			Insert(Bst->lchild, X);
		else if (Bst->element < X)
			Insert(Bst->rchlid, X);
		else
			return;
	}
}

void Delete(Tree* &Bst, ElemType X) {
	Tree* temp = new Tree;
	if (Bst == nullptr)
		throw std::out_of_range("BstTree is empty!!");
	else if (Bst->element > X)
		Delete(Bst->lchild, X);
	else if (Bst->element < X)
		Delete(Bst->rchlid, X);
	else
	{
		if (Bst->lchild && Bst->rchlid)
		{
			temp = FindMin(Bst->rchlid);
			Bst->element = temp->element;
			Delete(Bst->rchlid, Bst->element);
		}
		else
		{
			temp = Bst;
			if (Bst->lchild == nullptr)
				Bst = Bst->rchlid;
			else if (Bst->rchlid == nullptr)
				Bst = Bst->lchild;
			else
				delete temp;
		}
	}
}

void print(Tree* &Bst) {
	if (Bst == nullptr)
		return;
	else {
		std::cout << Bst->element << "\n";
		print(Bst->lchild);
		print(Bst->rchlid);
	}

}

int main(void)
{
	Tree* Bst = nullptr;
	std::vector<int>vec{ 9,5,3,56,12,78,54,1};
	for (const auto& x : vec) {
		Insert(Bst, x);
	};

	print(Bst);
	
	std::cout << "<<<<<<<<<<<<<<<<<<<<<<<<<<" << std::endl;
	std::cout << "delete a elem: 1" << "\n";
	Delete(Bst, 1);
	print(Bst);
}

发布了50 篇原创文章 · 获赞 11 · 访问量 4093

猜你喜欢

转载自blog.csdn.net/qq_43145594/article/details/100901544
今日推荐