菜鸟生成记(80)
1364: 删除给定值的叶子节点
这一题有点考验数据结构基础功底,删除几个节点就把我难住了,指针总是出错;最终从学长那里学了一个逻辑删除(没有真的删除节点,只是逻辑上删除节点,物理上节点还在);这玩意儿不用删除节点操作,操作安全
#include<stdio.h>
#include<iostream>
using namespace std;
typedef struct node{
int data;
int flag;
struct node *l,*r,*pre;
node()
{l=r=pre=NULL;flag=0;}
}*tree;
int n=0;
tree t[100];
void create(tree &T,tree f)
{
int x;
cin>>x;
if(x==-1)
T=NULL;
else
{
T=new node;
T->data=x;
T->pre=f;
create(T->l,T);
create(T->r,T);
}
}
void inp(tree T)
{
if(T)
{
if(T->flag==0)
cout<<T->data<<" ";
inp(T->l);
inp(T->r);
}
}
void dfs(tree &T,int x)
{
if(T)
{
if(T->l==NULL&&T->r==NULL&&T->data==x)
{
t[n++]=T;
return;
}
dfs(T->l,x);
dfs(T->r,x);
}
}
int main()
{
int x;
tree T=NULL,p;
create(T,T);
cin>>x;
dfs(T,x);
for(int i=0;i<n;i++)
{
p=t[i];
while(p)
{
if(p->l==NULL&&p->r==NULL&&p->data==x)
p->flag=1;
if(p->l!=NULL&&p->r!=NULL&&p->l->flag==1&&p->r->flag==1&&p->data==x)
p->flag=1;
if(p->l!=NULL&&p->l->flag==1&&p->r==NULL&&p->data==x)
p->flag=1;
if(p->r!=NULL&&p->l==NULL&&p->r->flag==1&&p->data==x)
p->flag=1;
p=p->pre;
}
}
inp(T);
return 0;
}