UVa 548 트리
사고방식: 중순과 후순 서열로 돌아가며 두 갈래 나무를 구성한다.순서 저장은 분명히 안 된다. 체인 저장을 사용한다.모든 결점은 알파벳이 아니라 숫자를 입력하기 때문에, 여기는 정형 수조로 저장되며, 더 이상 문자열이 아니기 때문에 더욱 편리할 수 있다.build(n, a1, a2) 함수는 중차 서열 a1과 후차 서열 a2를 이용하여 n개의 결점이 있는 두 갈래 트리를 구성하여 뿌리 결점 지침을 되돌려줍니다.귀속은 두 갈래 나무를 구성한 후 깊이 우선 검색을 하면 된다. 여기서 실현된 시비귀속 형식은 창고를 사용한다.
주의: 여러 경로가 최소와 값을 가지고 있을 때 잎사귀 결점이 가장 작은 출력을 선택하십시오.
여러 가지 작은 오류가 있는데 마지막에 연결했는데 입력 부분에 아직도 오류가 있다는 것을 발견했다. 만약while 중등가를 cnt1++로 바꾸면 오류가 발생할 수 있기 때문에 브레이크를 판단하는 조건을 ==1로 바꿀 수 없다. 왜냐하면 하나의 결점만 있을 때도 1이기 때문이다.
또한 프로그램 카드가 입력을 기다리는 동안 RE 오류가 발생합니다.즉, main에서 while (1) 을 벗어나는 조건인 if (cnt1=0) 를 주석하면 RE 오류가 발생합니다.
또한 테스트한 결과 파일 끝까지 읽을 때 계속 읽을 수 있고 EOF로 돌아갈 수 있습니다.즉if(cnt1=0) 주석을 지우고if(!cnt1&!cnt2)로 바꾸면 여전히 AC입니다. 첫 번째while 순환이 EOF로 읽을 때 두 번째while 순환이 읽히는 것은 문제없지만 여전히 EOF입니다.(이것은 완전히 RE를 시작했지만 아직 오류를 찾아내지 못했을 때 많은 생각을 했습니다~~) 이것은 EOF가 실제로 존재하는 문자가 아니라 표기 위치이기 때문인 것 같습니다.
또한 초기의 최소치leastv는 충분히 크게 설정하고 MAXN으로 설정하기 시작하면 WA~~친측...
RE 처음 시작할 때 remove가 없더라고요.tree, 메모리 유출로 인한 줄 알았어.방금 또 직접 측정해서remove_tree는 주석을 달았는데 이 문제는 뜻밖에도 없다.
preorder 선순,inorder 중순,postorder 후순.
Code:
#include
#include
#define MAXN 10010
typedef struct node
{
int data;
bool lvisit;
bool rvisit;
struct node *left,*right;
}Node;
int dfs(Node *u);
Node* build(int n,int *a1, int *a2);
int find(int t,int *a,int len);
Node* newNode();
void remove_tree(Node *u);
int main()
{
int a1[MAXN],a2[MAXN];
while(1)
{
int cnt1=0,cnt2=0;
while((scanf("%d",&a1[cnt1]))==1)
{
cnt1++;
char c=getchar();
if(c=='
') break;
}
//if(cnt1==0) break;
while((scanf("%d",&a2[cnt2]))==1)
{
cnt2++;
char c=getchar();
if(c=='
'||c==EOF) break;
}
if(!cnt1&&!cnt2) break;
Node *root=build(cnt1,a1,a2);
printf("%d
",dfs(root));
remove_tree(root);
}//while
return 0;
}
int dfs(Node *u)
{
Node *stack[MAXN]; int top=0;
stack[++top]=u;
int count=u->data; int leaf=0; int leastv=1000000000;
while(top)
{
Node *t=stack[top];
if(t->left==NULL && t->right==NULL)
{// ,
if(countdata;}
else if(count==leastv && t->datadata;
count=count-t->data;
top--;
}
else if(!t->lvisit && t->left!=NULL)
{// ,
stack[++top]=t->left;
t->lvisit=1;
count=count+stack[top]->data;
}
else if(!t->rvisit && t->right!=NULL)
{// ,
stack[++top]=t->right;
t->rvisit=1;
count=count+stack[top]->data;
}
else
{//
count=count-stack[top]->data;
top--;
}
}//while
return leaf;
}
Node* build(int n,int *a1, int *a2)
{
if(n<=0) return NULL;
Node *root=newNode();
root->data=a2[n-1];// n-1
int p=find(a2[n-1],a1,n);
root->left=build(p,a1,a2);
root->right=build(n-p-1,a1+p+1,a2+p);
return root;
}
int find(int t,int *a,int len)
{
int i=0;
while(idata=0;
u->lvisit=0;
u->rvisit=0;
u->left=u->right=NULL;
}
return u;
}
void remove_tree(Node *u)
{
if(u!=NULL)
{
remove_tree(u->left);
remove_tree(u->right);
free(u);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
두 갈래 나무의 순서 저장과 기본 조작1, 두 갈래 나무의 정의: 두 갈래 나무는 n개의 결점의 유한한 집합으로 n=0일 때 빈 나무라고 부른다. 그렇지 않으면 (1) 나무라고 불리는 특수한 뿌리 결점이 있다.(2) n>1시 나머지 결점은 서로 교차하지...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.