已经将代码利用注释解释的比较详细了,可以放心食用!!
#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;
}