이 진 트 리 의 구축 과 재 귀적, 비 재 귀적 재 귀적 작업
이 진 트 리 는 우리 가 평소에 많이 사용 하 는 데이터 구조 로 모든 노드 에 최대 두 개의 나무 가 있 는 나무 구조 이다.나무의 개념 과 성질 에 대해 더 이상 소개 하지 않 겠 습 니 다. 저 는 수의 구축 과 일부 조작 을 정리 하 겠 습 니 다.
우선 트 리 의 데이터 형식 을 정의 합 니 다:
4. 567913. 나 무 는 하나의 데이터 필드 와 두 개의 지침 도 메 인 이 있 고 체인 식 저장 구 조 를 사용한다.
우 리 는 tree 를 정의 합 니 다.node t 이후 트 리 를 만 들 고 입력 해 야 합 니 다:
typedef struct TREE_NODE
{
char data;
struct TREE_NODE *lchild;
struct TREE_NODE *rchild;
}*tree_node;
트 리 를 입력 하 는 과정 에서 우 리 는 기 호 를 입력 하여 이 트 리 의 노드 가 여기 서 멈 췄 는 지 여 부 를 판단 해 야 하기 때문에 if (ch = = '\ #') 를 판단 합 니 다.
이렇게 해서 우 리 는 나 무 를 만 들 었 고 데 이 터 를 입력 했다. 우 리 는 대수 에 있어 가장 기본 적 이 고 중요 한 조작 은 바로 옮 겨 다 니 는 것 이다. 나무의 옮 겨 다 니 는 방법 에 대해 우 리 는 세 가지 방식 이 있다. 그것 이 바로 앞 순 서 를 옮 겨 다 니 고 중간 순 서 를 옮 겨 다 니 며 뒤 순 서 를 옮 겨 다 니 는 것 이다. 우 리 는 먼저 재 귀적 으로 옮 겨 다 니 는 방법 을 살 펴 보 자.
tree_node createTree() //
{
char ch;
tree_node t;
ch=getchar(); //
if(ch=='#') //
t=NULL;
else
{
t=(tree_node)malloc(sizeof(tree_node)); //
t->data=ch;
t->lchild=createTree();
t->rchild=createTree();
}
return t;
}
void preOrder(tree_node t) //
{
if(t)
{
printf("%c",t->data);
preOrder(t->lchild);
preOrder(t->rchild);
}
}
void intOrder(tree_node t) //
{
if(t)
{
intOrder(t->lchild);
printf("%c",t->data);
intOrder(t->rchild);
}
}
이것 은 우리 가 재 귀적 인 방식 으로 나 무 를 옮 겨 다 니 는 것 입 니 다. 만약 에 우리 가 재 귀적 인 방식 을 사용 하지 않 는 다 면 우 리 는 어떻게 옮 겨 다 니 는 것 입 니까?
void preOrder(tree_node t) //
{
if(t)
{
printf("%c",t->data);
preOrder(t->lchild);
preOrder(t->rchild);
}
}
void preOrder(tree_node t) //
{
stack<tree_node> s;
tree_node p = t;
while(p!=NULL || !s.empty())
{
while(p!=NULL)
{
cout << p->data;
s.push(p);
p = p->lchild;
}
if(!s.empty())
{
p = s.top();
s.pop();
p = p->rchild;
}
}
}
void intOrder(tree_node t) //
{
stack<tree_node> s;
tree_node p = t;
while(p!= NULL || !s.empty())
{
while(p!=NULL)
{
s.push(p);
p = p->lchild;
}
if(!s.empty())
{
p = s.top();
cout << p->data;
s.pop();
p = p->rchild;
}
}
}
재 귀적 이지 않 은 뒷 순 서 를 옮 겨 다 니 는 것 이 비교적 번 거 롭 습 니 다. 우 리 는 왼쪽 트 리 를 따라 계속 아래로 검색 해 야 합 니 다. 왼쪽 트 리 가 없 을 때 까지 우 리 는 스 택 에 방문 할 수 없습니다. 우 리 는 오른쪽 트 리 를 스 택 에 들 어가 라 고 말 해 야 합 니 다. 우 리 는 오른쪽 트 리 를 똑 같이 처리 한 후에 야 스 택 에 방문 할 수 있 습 니 다. 그러면 우 리 는 표 지 를 하나 더 설정 해 야 합 니 다.두 번 째 로 창고 꼭대기 에 도 착 했 을 때 만 우 리 는 창 고 를 방문 할 수 있다.
전체 코드 는 다음 과 같 습 니 다:
typedef struct node1
{
TREE_NODE *btnode;
bool isFirst;
}*BTNode;
void postOrder(tree_node t) //
{
stack<BTNode> s;
tree_node p = t;
BTNode q;
while(p!=NULL || !s.empty())
{
while(p!=NULL)
{
BTNode bt = (BTNode)malloc(sizeof(BTNode));
bt->btnode = p;
bt->isFirst = true;
s.push(bt);
p = p->lchild;
}
if(!s.empty())
{
q = s.top();
s.pop();
if(q->isFirst ==true)
{
q->isFirst = false;
s.push(q);
p = q->btnode->rchild;
}
else
{
cout << q->btnode->data;
p = NULL;
}
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.