C 언어 는 이 진 트 리 데이터 구 조 를 만 들 고 여러 가지 사 이 를 옮 겨 다 닙 니 다.
19224 단어 데이터 구조
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct BiTree{
int data;
struct BiTree* lchild;
struct BiTree* rchild;
}BiTree, *PBiTree;
typedef struct Stack{
BiTree* data[128];
int top;
}Stack;
void stack_init(Stack* pStack)
{
memset(pStack, 0, sizeof(Stack));
pStack->top = -1;
}
BiTree* stack_pop(Stack* pStack)
{
if(pStack->top == -1)
return NULL;
return pStack->data[pStack->top--];
}
BiTree* stack_get_top(Stack* pStack)
{
if(pStack->top == -1)
return NULL;
else
return pStack->data[pStack->top];
}
int stack_push(Stack* pStack, BiTree* pBiTree)
{
if(pStack->top == 127)
return 0;
pStack->data[++pStack->top] = pBiTree;
return 1;
}
int stack_is_empty(Stack* pStack)
{
return pStack->top == -1;
}
int bitree_create(BiTree** ppBiTree)
{
int data;
for(;;){
printf(" :");
if(scanf("%d", &data) == 1)
break;
fflush(stdin);
}
if(data == 0){
(*ppBiTree) = NULL;
return 1;
}else{
(*ppBiTree) = (PBiTree)malloc(sizeof(BiTree));
if(!*ppBiTree){
perror(" ");
return 0;
}else{
memset(*ppBiTree, 0, sizeof(BiTree));
(*ppBiTree)->data = data;
bitree_create(&(*ppBiTree)->lchild);
bitree_create(&(*ppBiTree)->rchild);
}
}
return 1;
}
//
void bitree_free(BiTree* pBiTree)
{
if(pBiTree){
bitree_free(pBiTree->lchild);
bitree_free(pBiTree->rchild);
free(pBiTree);
pBiTree = NULL;
}
}
/* */
void PreOrderTraverse(BiTree* pBiTree)
{
Stack stk;
BiTree* pb = pBiTree;
stack_init(&stk);
while(pb || !stack_is_empty(&stk)){
while(pb){
printf("%d ", pb->data);
stack_push(&stk, pb);
pb = pb->lchild;
}
pb = stack_pop(&stk);
pb = pb->rchild;
}
}
/* */
void PreOrderTraverse2(BiTree* pBiTree)
{
if(pBiTree){
printf("%d ", pBiTree->data);//
PreOrderTraverse2(pBiTree->lchild);//
PreOrderTraverse2(pBiTree->rchild);//
}
}
/* */
void InOrderTraverse2(BiTree* pBiTree)
{
if(pBiTree){
InOrderTraverse2(pBiTree->lchild);
printf("%d ", pBiTree->data);
InOrderTraverse2(pBiTree->rchild);
}
}
/* 2 */
void InOrderTraverse3(BiTree* pBiTree)
{
Stack stk;
BiTree* pb = NULL;
stack_init(&stk);
pb = pBiTree;
while(pb || !stack_is_empty(&stk)){
if(pb){
stack_push(&stk, pb);//
pb = pb->lchild;//
}else{
// , ,
pb = stack_pop(&stk);
printf("%d ", pb->data);
pb = pb->rchild;
}
}
}
/* */
void InOrderTraverse(BiTree* pBiTree)
{
Stack stk;
BiTree* pb = NULL;
stack_init(&stk);//
stack_push(&stk, pBiTree);//
while(!stack_is_empty(&stk)){
while((pb=stack_get_top(&stk)))
stack_push(&stk, pb->lchild);//
pb = stack_pop(&stk);//
if(!stack_is_empty(&stk)){
pb = stack_pop(&stk);// /
printf("%d ", pb->data);
stack_push(&stk, pb->rchild);//
}
}
}
/* */
void PostOrderTraverse(BiTree* pBiTree)
{
Stack stk;
BiTree* pb = NULL;
BiTree* pre = NULL;
stack_init(&stk);
while(pBiTree || !stack_is_empty(&stk)){
while(pBiTree){
stack_push(&stk, pBiTree);
pBiTree = pBiTree->lchild;
}
pBiTree = stack_get_top(&stk);
if(!pBiTree->rchild || pBiTree->rchild == pre){
printf("%d ", pBiTree->data);
stack_pop(&stk);
pre = pBiTree;
pBiTree = NULL;
}else{
pBiTree = pBiTree->rchild;
}
}
}
/* */
void PostOrderTraverse2(BiTree* pBiTree)
{
if(pBiTree){
PostOrderTraverse(pBiTree->lchild);
PostOrderTraverse(pBiTree->rchild);
printf("%d ", pBiTree->data);
}
}
int main(void)
{
BiTree* pbt = NULL;
bitree_create(&pbt);
printf("
");
printf(" :\t");
PreOrderTraverse(pbt);
printf("
");
printf(" :\t");
PreOrderTraverse2(pbt);
printf("
");
printf(" :\t");
InOrderTraverse(pbt);
printf("
");
printf(" :\t");
InOrderTraverse2(pbt);
printf("
");
//printf(" 2:\t");
//InOrderTraverse3(pbt);
//printf("
");
printf(" :\t");
PostOrderTraverse(pbt);
printf("
");
printf(" :\t");
PostOrderTraverse2(pbt);
printf("
");
printf("
");
bitree_free(pbt);
system("pause");
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.