openjudge 트리의 변환
7: 트리 변환
보기제출 통계질문총 시간 제한:
5000ms
메모리 제한:
65536kB
묘사
우리는 모두 왼쪽 아들 오른쪽 형제의 방법으로 일반적인 나무 한 그루를 두 갈래 나무로 바꿀 수 있다는 것을 안다. 예를 들어
0 0
/ | \ /
1 2 3 ===> 1
/ \ \
4 5 2
/ \
4 3
\
5
이제 일반적인 나무를 이런 방법으로 두 갈래 나무로 바꾸고 전환 전과 전환 후 나무의 높이를 출력해 주십시오.
입력
입력은 여러 줄을 포함하고 마지막 줄은 하나의 #로 끝납니다.
각 줄은 "u"와 "d"로 구성된 문자열로 나무의 깊이가 정보를 우선적으로 검색하는 것을 나타낸다.예를 들어 dudduuudu는 위의 왼쪽 트리를 표시할 수 있습니다. 검색 과정은 0 Down to 1 Up to 0 Down to 2 Down to 4 Up to 2 Down to 5 Up to 2 Up to 0 Down to 3 Up to 0이기 때문입니다.
너는 나무마다 결점이 적어도 2이고 10000을 넘지 않는다고 생각할 수 있다.
출력
각 트리의 경우 변환 전과 변환 후 트리 높이를 다음 형식으로 내보냅니다.
Tree t: h1 => h2
그 중에서 t는 나무의 번호(1부터), h1은 전환 전 나무의 높이, h2는 전환 후 나무의 높이이다.
샘플 입력
dudduduudu
ddddduuuuu
dddduduuuu
dddduuduuu
#
샘플 출력
Tree 1: 2 => 4
Tree 2: 5 => 5
Tree 3: 4 => 5
Tree 4: 4 => 4
코드 목록
#include <iostream>
using namespace std;
#include <stack>
#define MAXN 20010
typedef struct _tnode
{
int info;
struct _tnode *lmchild;
struct _tnode *rsibling;
} tnode;
stack<tnode *> rootstack;
tnode *build_bin_tree(char inputseq[], tnode *root, int *max_stack_sz)
{
char *p=inputseq;
int val=1;
tnode *father, *temp, *current;
while( *p != '\0' )
{
if (*p == 'd') //
{
temp=new tnode;
temp->info=(val++);
temp->lmchild=NULL;
temp->rsibling=NULL;
father=rootstack.top();
//temp father , , father left-most-child(lmc) , lmc right sibling ?
if(father->lmchild == NULL) // father lmc
{
father->lmchild=temp;
}
else // lmc right sibling
{
current=father->lmchild;
while (current->rsibling != NULL) current=current->rsibling;
current->rsibling=temp;
}
rootstack.push(temp);
if(rootstack.size() > (*max_stack_sz)) (*max_stack_sz)=rootstack.size(); //
}
else
{
rootstack.pop();
}
++p;
}
return root;
}
int bin_tree_layer(tnode *root) //
{
int left_h, right_h;
if(root==NULL) return 0;
else
{
left_h = 1 + bin_tree_layer(root->lmchild);
right_h = 1 + bin_tree_layer(root->rsibling);
if (left_h > right_h) return left_h;
else return right_h;
}
}
void delete_bin_tree(tnode *root)
{
if (root != NULL)
{
delete_bin_tree(root->lmchild);
delete_bin_tree(root->rsibling);
delete root;
root=NULL;
}
}
int main()
{
//freopen("D:\\in.txt", "r", stdin);
//freopen("D:\\out.txt", "w", stdout);
tnode *root;
int max_stack_sz, bt_layers, serial=0;
char inputseq[MAXN];
while (1)
{
cin.getline(inputseq, MAXN, '
');
if(inputseq[0] == '#') break;
//
++serial;
root=new tnode;
root->info=0;
root->lmchild=NULL;
root->rsibling=NULL;
while(!rootstack.empty()) rootstack.pop();
rootstack.push(root);
max_stack_sz=1;
//
root = build_bin_tree(inputseq, root, &max_stack_sz);
bt_layers = bin_tree_layer(root);
cout<<"Tree "<<serial<<": "<<(max_stack_sz-1)<<" => "<<(bt_layers-1)<<endl;
//
delete_bin_tree(root);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java 데이터 구조 2차원 트리의 실현 코드일.두 갈래 트리 인터페이스 2 노드 클래스 3. 두 갈래 나무 구현 이 글을 통해 여러분께 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.