[데이터 구조] 이 진 트 리 의 재 귀 와 비 재 귀 옮 겨 다 니 기
B C
D E F G
H I J
선착순 으로 옮 겨 다 니 며 "\ #" 로 비 어 있 음 을 표시 하고 ABDH \ # \ # I \ # \ # EJ \ # \ # \ # CF \ # \ # G \ # \ # 를 입력 하 십시오.
앞 순서 옮 겨 다 니 기: 뿌리 - > 왼쪽 - > 오른쪽 ABDHIEJCFG
중간 순서: 왼쪽 - > 뿌리 - > 오른쪽 HDIBJEAFCG
뒤 순 옮 겨 다 니 기: 왼쪽 - > 오른쪽 - > 뿌리 HIDJEBFGCA
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
typedef char Elementtype;
typedef struct node
{
struct node *lchild;
struct node *rchild;
Elementtype data;
}BiTreeNode, *BTREE;
void CreateBTree(BTREE &T) //
{
char c;
cin >> c;
if('#' == c)
T = NULL;
else
{
T = new node;
T->data = c;
CreateBTree(T->lchild); //
CreateBTree(T->rchild);
}
}
int IsEmpty(BTREE root)
{
if (root == NULL)
return 1;
else
return 0;
}
void Visit(Elementtype data)
{
printf("%c ",data);
}
void InOrder(BTREE root)//
{
if (IsEmpty(root) == 0)
{
InOrder(root->lchild);
Visit(root->data);
InOrder(root->rchild);
}
}
void PreOrder(BTREE root){//
if(IsEmpty(root) == 0){
Visit(root->data);
PreOrder(root->lchild);
PreOrder(root->rchild);
}
}
void PostOrder(BTREE root){//
if(IsEmpty(root) == 0){
PostOrder(root->lchild);
PostOrder(root->rchild);
Visit(root->data);
}
}
void N_InOrder(BTREE T)//
{
stack<BTREE> STACK;
if(IsEmpty(T))
{
cout << "Empty Tree!" << endl;
return;
}
while(T || !STACK.empty())
{
while(T)
{
STACK.push(T);
T=T->lchild;
}
T=STACK.top();
STACK.pop();
printf("%c ",T->data);
T=T->rchild;
}
}
void N_PreOrder(BTREE T)
{
stack<BTREE> STACK;
if(IsEmpty(T))
{
cout << "Empty Tree!" << endl;
return;
}
while(T || !STACK.empty())
{
while(T)
{
STACK.push(T);
printf("%c ",T->data);
T=T->lchild;
}
T=STACK.top();
STACK.pop();
T=T->rchild;
}
}
void N_PostOrder(BTREE T) //
{
stack<BTREE> STACK;
BTREE curr = T ; //
BTREE previsited = NULL; //
while(curr != NULL || !STACK.empty()) //
{
while(curr != NULL) //
{
STACK.push(curr);
curr = curr->lchild;
}
curr = STACK.top();
// ,
if(curr->rchild == NULL || curr->rchild == previsited)
{
cout<<curr->data<<" ";
previsited = curr;
STACK.pop();
curr = NULL;
}
else
curr = curr->rchild;//
}
}
void N_PostOrder_S(BTREE T) //
{
stack<BTREE> s1,s2;
BTREE curr ; //
s1.push(T);
while(!s1.empty()) //
{
curr = s1.top();
s1.pop();
s2.push(curr);
if(curr->lchild)
s1.push(curr->lchild);
if(curr->rchild)
s1.push(curr->rchild);
}
while(!s2.empty())
{
printf("%c ", s2.top()->data);
s2.pop();
}
}
int visit(BTREE T)
{
if(T)
{
printf("%c ",T->data);
return 1;
}
else
return 0;
}
void Traverse(BTREE T)//
{
queue<BTREE> Q;
BTREE p;
p = T;
if(visit(p)==1)
Q.push(p);
while(!Q.empty())
{
p = Q.front();
Q.pop();
if(visit(p->lchild) == 1)
Q.push(p->lchild);
if(visit(p->rchild) == 1)
Q.push(p->rchild);
}
}
int main()
{
BTREE T;
CreateBTree(T);
InOrder(T);
cout << endl;
N_InOrder(T);
cout << endl;
N_PreOrder(T);
cout << endl;
N_PostOrder(T);
cout << endl;
N_PostOrder_S(T);
cout << endl;
Traverse(T);
cout << endl;
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
9. 데이터 구조의 이 진 트 리그 다음 에 우 리 는 이 진 트 리 의 생 성, 소각, 옮 겨 다 니 기, 그리고 각종 이 진 트 리 의 성질 에 착안 하여 (높이, 노드 개수, 균형 여부 등 특성) 이 진 트 리 의 일부 응용 을 소개 해 야 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.