学习随记三十一——递归实现二叉查找树

递归实现二叉查找树

什么是二叉查找树:左子树中的元素都比父节点元素小,右子树中的元素都比父节点中的元素大

二叉查找树的基本操作
1、生成一颗空树
我选择使用递归来完成,如果传入的地址非空就先递归删除左子树再递归删除右子树;也可以直接生成一个空根。

2、查找元素
先判断传入的指针是不是空指针,如果非空再进行比较,如果待查找元素比结点元素小则在该结点的左子树中递归查找,大则在右子树中递归查找,相等则返回该结点地址。
3、插入元素(不考虑与已存在的元素相等的情况)
将待插入的元素与结点元素进行比较,如果待插入的元素小则在结点的左子树中递归的查找合适的位置插入,如果待插入的元素大则在结点的右子树中递归查找合适的元素插入。
4、删除结点:删除结点的情况比较复杂,主要有三种
一:待删除的结点是树叶,这种情况最简单,可以直接删除这个结点;
二:待删除的结点有一个子节点,使其父结点指向其子结点后再删除即可;
三:待删除的结点有两个子结点,在其右子树中找到最小的那个结点用其数据覆盖掉待删除的结点再递归删除那个右子树中最小的结点,这样删除的好处是避免了指针的大的改动且操作简单,缺点是效率偏低因为还要再一次使用递归删除右子树中的最小的结点。
5、打印树中元素
使用中序输出,先递归输出结点左子树的元素再递归输出右子树结点的元素

整体代码:

#include<iostream>
typedef int ElementType;
struct TreeNode{
	ElementType data;
	struct TreeNode* Left=nullptr;
	struct TreeNode* Right=nullptr;
};
typedef struct TreeNode* Position;
typedef struct TreeNode* SearchTree;
using namespace std;
SearchTree MakeEmpty(SearchTree);
void Input(SearchTree);
Position Find(ElementType,SearchTree);
Position FindMin(SearchTree);
Position FindMax(SearchTree);
SearchTree Insert(ElementType,SearchTree);
SearchTree Delete(ElementType,SearchTree);
void PrintTree(SearchTree);
int main(void){
  struct TreeNode p;
  SearchTree s=&p;
	MakeEmpty(s);
	Input(s);
	int x=0;
	cout<<"请输入你想要删除的元素"<<endl;
	cin>>x;
	Delete(x,s);
	PrintTree(s);
	return 0;
}
SearchTree MakeEmpty(SearchTree T){
	if(T!=nullptr){
		MakeEmpty(T->Left);
		MakeEmpty(T->Right);
		delete(T);
	}
	return nullptr;
}
void Input(SearchTree T){
	int x=0,i=1;
	cout<<"Please input number."<<endl;
	cin>>x;
	T->data=x;
	while(cin>>x){
	 Insert(x,T);
	}
	cin.clear();
	cin.ignore();
}
Position Find(ElementType X,SearchTree T){
	if(T==nullptr)return nullptr;
	else if(X<T->data)return Find(X,T->Left);
	else if(X>T->data)return Find(X,T->Right);
	else return T;
}
Position FindMin(SearchTree T){
	if(T==nullptr)return nullptr;
	else if(T->Left==nullptr)return T;
	else return FindMin(T->Left);
//if(T!=nullptr)while(T->Left!=nullptr)T=T->Left;
//return T;
}
Position FindMax(SearchTree T){
	if(T!=nullptr)while(T->Right!=nullptr)T=T->Right;
	return T;
}
SearchTree Insert(ElementType X,SearchTree T){
	if(T==nullptr){ //create and return a one-node tree
		T=new struct TreeNode;
		if(T==nullptr){
		cout<<"Out of space!!!";
		exit(0);
		}
		else T->data=X;
	}else if(X<T->data) {
	 T->Left=Insert(X,T->Left);
	}else if(X>T->data) {
	 T->Right=Insert(X,T->Right);
	 }
/*Else X is in the tree already; we'll do nothing*/
	return T;/*Don't forget this line*/
}
SearchTree Delete(ElementType X,SearchTree T){
	/*Replace with smallest in right subtree*/
	Position TempCell;
	if(T==nullptr){
	cout<<"Element not found.";
	exit(0);
	}
	else if(X<T->data)  T->Left=Delete(X,T->Left);
	else if(X>T->data) T->Right=Delete(X,T->Right);
	else if(T->Left&&T->Right){
	/* The node should be delete has two children*/
	TempCell=FindMin(T->Right);
	T->data=TempCell->data;
	T->Right=Delete(T->data,T->Right);
	}else{
	/* The node should be delete has one or zero children*/
	TempCell=T;
	if(T->Left==nullptr) T=T->Right;
	else if(T->Right==nullptr)T=T->Left;
	free(TempCell);
	TempCell=nullptr;
	}
	return T;
}
void PrintTree(SearchTree T){
	if(T!=nullptr){
		PrintTree(T->Left);
		cout<<T->data<<endl;
		PrintTree(T->Right);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值