用的是考研数据结构所学的二叉树结构体+二叉树相关算法
天津大学2007年算法设计题第三题
代码实现参考b站up主--我头发还多还能学
关键代码如下:
void delTree(BiTree &root)//删除以x为根的子树
{
if(root!=NULL)
{
delTree(root->lchild);
delTree(root->rchild);
free(root);
root=NULL;
}
}
void delsub(BiTree &root,int x)//找到值为x的结点
{
if(root!=NULL)
{
if(root->data==x)
{
delTree(root);
}
else{
delsub(root->lchild,x);
delsub(root->rchild,x);
}
}
}
这个代码是可以删除二叉树中所有结点为x的子树
然后我写了下面的代码来验证他确实是删完了,写的有点麻烦了,但是正好顺便背默一下其他几个重点代码:
#include<iostream>
using namespace std;
//树的结构体
typedef struct BTNode{
int data;
struct BTNode *lchild,*rchild;
}BTNode,*BiTree;
//二叉树以顺序存储(层序遍历的顺序)的方式存在数组a中,将他转化为二叉链表的形式
//空结点用-1代替
BiTree create(int a[],int i,int n)//创建链式存储的二叉树
{
if(i<n&&a[i]!=-1)
{
BiTree root=(BiTree)malloc(sizeof(BTNode));
root->data=a[i];
root->lchild=create(a,2*i+1,n);
root->rchild=create(a,2*i+2,n);
return root;
}
return NULL;
}
//删除以root为根节点的子树
void delTree(BiTree &root)
{
if(root!=NULL)
{
delTree(root->lchild);
delTree(root->rchild);
free(root);
root=NULL;
}
}
//找到值为x的结点并删除
void delsub(BiTree &root,int x)
{
if(root!=NULL)
{
if(root->data==x)
{
delTree(root);
}
else{
delsub(root->lchild,x);
delsub(root->rchild,x);
}
}
}
//先序遍历输出二叉树
void pre(BiTree T)
{
if(T!=NULL)
{
cout<<T->data<<endl;
pre(T->lchild);
pre(T->rchild);
}
}
int main()
{
int n;
cin>>n;//输入数组长度
int a[n];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int i=0;
BiTree T=create(a,i,n);
int x;
cin>>x;
delsub(T,x);
pre(T);
}