二叉树的基本操作C++(结构体实现)

已经将代码利用注释解释的比较详细了,可以放心食用!!

#include<bits/stdc++.h>
using namespace std;
struct Tree                                                  //二叉树节点的定义 
{
	int  data;    //数据域 
	Tree* left;   //左结点指针 
	Tree* right;   //y右结点指针 
};

Tree* Zero(int x)                                             //初始化一颗树 
{
	Tree* t=new Tree;  //开辟空间 
	t->data=x;         //为节点的数据域赋值 
	t->left=NULL;      //初始化左节点指针,使其指向空 
	t->right=NULL;     //初始化右结点指针,使其指向空 
	return t;          //返回创建好的结点 
}

Tree* Push(Tree* T,int x)                                              //向二叉树插入一个结点 
{
	if(T==NULL)      //若当前节点为空(树不存在) 
	return Zero(x);     //创建一颗树 
	if(x<=T->data)              //若要插入的数据小于当前节点的数据则将其插入左树中 
	T->left=Push(T->left,x);      
	else                       //若要插入的数据大于当前节点的数据则将其插入右树中 
	T->right=Push(T->right,x);
	return T;    //返回插入完成的数 
}

bool search(Tree* T,int x)                                              //搜索树中的某个结点(数据) 
{
	if(T==NULL)      return false;      //不存在返回FALSE 
	if(T->data==x)     return true;       //存在返回TRUE 
	if(x<T->data )             //若要搜索的数据小于当前节点的数据则向左树递归搜索 
	return search(T->left,x);
	if(x>T->data)              //若要搜索的数据大于当前节点的数据则向右树递归搜索 
	return search(T->right,x);
}

Tree* Find_Min(Tree* T)                                            //找到以 T 为根的子数的最小结点 
{
	while(T->left!=NULL) //若没到底则继续向下 
	T=T->left;      //改变指向使其指向下一个节点 
	return T;        //返回最小结点 
}

Tree* Find_Max(Tree* T)                                          //找到以 T 为根的子数的最大结点(原理同上) 
{
	while(T->right!=NULL)
	T->right;
	return T;
}

Tree* pop(Tree* T,int x)                                               //删除某个结点 
{
	if(T==NULL)      //如果为空则返回NULL 
	return T;
	if(x>T->data)                     //若要删除的数据大于当前节点的数据则向右树递归搜索 
		T->right = pop(T->right,x);
	else if(x<T->data)                 //若要删除的数据小于当前节点的数据则向左树递归搜索 
		T->left =pop(T->left,x);
	else                              //找到相等的数据时 
	{
		if(T->left==NULL)             //若其没有左结点 
		{
			Tree* temp=T->right ;       //保存当前指针 
	 	    delete T;               //释放要删除结点的空间 
		    return temp;
		}
		else if(T->right==NULL)     //若没有右结点 
		{
			Tree* temp=T->left;     //保存当前结点 
			delete T;             //释放要删除结点的空间 
			return temp;
		}
		// 如果当前节点既有左子节点又有右子节点,则找到以其右子树为根的子树中的最小节点,将其作为新的当前节点
		Tree* temp=Find_Min(T->right);    //找到最小节点 
		T->data=temp->data;     
		T->right=pop(T->right,temp->data);   
	}
	return T;    //返回进过处理后的树 
}

void traverse(Tree* T)                                  //先序遍历二叉树 
{
	if(T!=NULL)     //若树不为空 
	{
		cout<<T->data<<" ";     //递归输出结点数据 
		traverse(T->left);
		traverse(T->right);
    }
}

int main()
{
	int i,n,a[100];         //定义数据数据类型 
	Tree* T=NULL;
	cout<<"输入插入的数据个数: ";
	cin>>n;
	for(i=0;i<n;i++)     //插入结点 
	{
		cin>>a[i];
		T=Push(T,a[i]);
	}
	cout<<"先序遍历结果如下:"<<endl;
	traverse(T);              //遍历 
	cout<<endl;
	cout<<"输入需要查找的数据:"<<endl;
	cin>>n;
	if(search(T,n))
	cout<<"结点"<<n<<"不存在于二叉树中:"<<endl;
	else 
	cout<<"结点"<<n<<"存在于二叉树中:"<<endl;
	cout<<"输入需要删除的结点数据:";
	cin>>n;
	T=pop(T,n);
	traverse(T);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值