이 진 트 리 의 각 결점 의 자손 수 를 구하 다.
4664 단어 알고리즘 문제
이 진 링크 의 결산 점 에 DescNum 역 을 추가 하여 이 결산 점 의 자손 수 를 표시 합 니 다.이 진 트 리 의 모든 노드 의 자손 수 를 구하 고 DescNum 필드 에 저장 하 는 알고리즘 을 만 듭 니 다.
생각:
/*
*/
#include "bitree.h"
typedef struct myTNode
{
int data;
int descendant;
struct myTNode* lchild;
struct myTNode* rchild;
}myBiTree, *pmyBiTree;
void mycreat_tree(pmyBiTree &rt)
{
char ch;
ch=getchar();
if('#'==ch)
{
rt=NULL;
}
else
{
rt=(pmyBiTree)malloc(sizeof(myBiTree));
rt->data=ch;
rt->descendant = 0;
mycreat_tree(rt->lchild); //
mycreat_tree(rt->rchild); //
}
}
void DescNumber(pmyBiTree &rt)
{
if(!rt)
return;
stack s;
pmyBiTree cur = rt;
pmyBiTree pre = NULL;
while(!s.empty() || cur != NULL)
{
while(cur)
{
s.push(cur);
cur = cur->lchild;
}
cur = s.top();
if(cur->rchild == NULL || cur->rchild == pre)
{
if(cur->lchild)
cur->descendant += cur->lchild->descendant + 1;
if(cur->rchild)
cur->descendant += cur->rchild->descendant + 1;
pre = cur;
cur = NULL;
s.pop();
}
else
{
cur = cur->rchild;
}
}
}
void PreOrderPrintDesc(pmyBiTree &rt)
{
cout << "PreOrderPrintDesc: " << endl;
if(!rt)
return;
stack s;
s.push(rt);
while(!s.empty())
{
pmyBiTree cur = s.top();
cout << (char)(cur->data) << " Desc: " << cur->descendant << endl;
s.pop();
if(cur->rchild)
s.push(cur->rchild);
if(cur->lchild)
s.push(cur->lchild);
}
cout << '@' << endl;
}
int main(int argc, char const *argv[])
{
pmyBiTree root;
mycreat_tree(root);
DescNumber(root);
PreOrderPrintDesc(root);
return 0;
}
함수
void DescNumber(pmyBiTree &rt)
는 이 진 트 리 rt 의 모든 결점 의 DescNum 역 을 계산 합 니 다.이 는 후속 적 으로 옮 겨 다 니 는 사고방식 을 이용 하여 차이 점 은 바로 현재 결점 을 인쇄 해 야 할 때 좌우 결점 이 존재 하 는 지 에 따라 본 결점 의 자손 수 를 계산한다.이 문 제 는 이 진 트 리 의 3 중 옮 겨 다 니 는 방법의 중요성 을 충분히 설명 하고 많은 문 제 를 재 귀적 이지 않 아 도 되 고 복잡 하지 않 아 도 해결 할 수 있다.이 알고리즘 은 복잡 도가 O (n) 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[못 푼 문제] 백준 10989번sys.stdin.readline()을 사용하여 input의 시간을 줄였다. 또한 입력 가능한 수의 개수가 10,000,000개 이고 최대 입력 가능한 수가 10,000이기 때문에 모든 수를 입력 받아 리스트로 만들...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.