이 진 트 리 의 만 들 기, 옮 겨 다 니 기
이 프로그램 은 자체 적 으로 데이터 구 조 를 참고 하여 스 택 과 대기 열의 템 플 릿 류 를 다시 참고 하고 인터넷 의 프로그램 을 참고 하여 이 진 트 리 의 구축 과 세 가지 스 트 리밍 방식 (재 귀 와 비 재 귀 실현 포함) 을 썼 다.
대기 열의 실현:
#ifndef __BT_QUEUE__
#define __BT_QUEUE__
/************************************************************************/
/* , 、 、 */
/* , */
/************************************************************************/
#include <iostream>
template<typename T>
class BT_Queue
{
public:
BT_Queue(void);
~BT_Queue(void){}
typedef struct qnode{
T data;
struct qnode *next;
}QTYPE;
QTYPE *front, *rear;
void initQueue();
void push(T t);
void pop();
int empty();
};
template<typename T>
BT_Queue<T>::BT_Queue(void)
{
initQueue();
}
template<class T>
void BT_Queue<T>::initQueue()
{
QTYPE *p;
p = (QTYPE*)malloc(sizeof(QTYPE));
p->next = NULL;
front = rear = p;
}
template<class T>
void BT_Queue<T>::push(T t)
{
QTYPE *s;
s = (QTYPE*)malloc(sizeof(QTYPE));
s->data = t;
s->next = rear->next;
rear->next = s;
rear = s;
}
template<class T>
int BT_Queue<T>::empty()
{
return front == rear ? 1 : 0;
}
template<class T>
void BT_Queue<T>::pop()
{
QTYPE *p;
if(empty())
{
printf("queue is free");
return;
}
p = front->next;
front->next = p->next;
if(front->next == NULL)
rear = front;
free(p);
}
#endif
템 플 릿 류 의 설명 과 구현 을 같은 파일 에 두 어야 합 니 다.
창고 의 실현:
#ifndef __BT_STACK__
#define __BT_STACK__
#include <iostream>
template<class T>
class BT_Stack
{
public:
BT_Stack();
~BT_Stack(){}
typedef struct snode{
T data;
struct snode *next;
}LinkStack;
LinkStack *top;
void initStack();
void push(T t);
void pop();
int empty();
T getTop();
};
template<class T>
BT_Stack<T>::BT_Stack()
{
initStack();
}
template<class T>
void BT_Stack<T>::initStack()
{
top = (LinkStack*)malloc(sizeof(LinkStack));
(top)->next = NULL;
}
template<class T>
void BT_Stack<T>::push(T t)
{
LinkStack* s;
s = (LinkStack*)malloc(sizeof(LinkStack));
s->data = t;
s->next = (top)->next;
(top)->next = s;
}
template<class T>
int BT_Stack<T>::empty()
{
return (top)->next == NULL ? 1 : 0;
}
template<class T>
void BT_Stack<T>::pop()
{
LinkStack *s;
if(empty())
{
printf("stack is free");
return;
}
s = (top)->next;
(top)->next = s->next;
free(s);
}
template<class T>
T BT_Stack<T>::getTop()
{
if(empty())
{
printf("stack is free");
return NULL;
}
return (top)->next->data;
}
#endif
이 진 트 리 코드 부분:
#include <stdio.h>
#include <malloc.h>
#include <time.h>
// #include <stack>
// #include <queue>
#include <assert.h>
#include "BT_Queue.h"
#include "BT_Stack.h"
using namespace std;
#define MAX_CNT 10
#define BASE 100
typedef int ElemType;
typedef struct treeT
{
ElemType key;
struct treeT* left;
struct treeT* right;
}treeT, *pTreeT;
//
static void visit(pTreeT root)
{
if (NULL != root)
{
printf(" %d
", root->key);
}
}
//
static pTreeT BT_MakeNode(ElemType target)
{
pTreeT pNode = (pTreeT) malloc(sizeof(treeT));
assert( NULL != pNode );
pNode->key = target;
pNode->left = NULL;
pNode->right = NULL;
return pNode;
}
//
pTreeT BT_Insert(ElemType target, pTreeT* ppTree)
{
pTreeT Node;
assert( NULL != ppTree );
Node = *ppTree;
if (NULL == Node)
{
return *ppTree = BT_MakeNode(target);
}
if (Node->key == target) //
{
return NULL;
}
else if (Node->key > target) //
{
return BT_Insert(target, &Node->left);
}
else
{
return BT_Insert(target, &Node->right);
}
}
// ( )
void BT_PreOrder(pTreeT root)
{
if (NULL != root)
{
visit(root);
BT_PreOrder(root->left);
BT_PreOrder(root->right);
}
}
// ( )
void BT_PreOrderNoRec(pTreeT root)
{
BT_Stack<treeT *> s;
while ((NULL != root) || !s.empty())
{
if (NULL != root)
{
visit(root);
s.push(root);
root = root->left;
}
else
{
root = s.getTop();
s.pop();
root = root->right;
}
}
}
// ( )
void BT_InOrder(pTreeT root)
{
if (NULL != root)
{
BT_InOrder(root->left);
visit(root);
BT_InOrder(root->right);
}
}
// ( )
void BT_InOrderNoRec(pTreeT root)
{
BT_Stack<treeT *> s;
while ((NULL != root) || !s.empty())
{
if (NULL != root)
{
s.push(root);
root = root->left;
}
else
{
root = s.getTop();
visit(root);
s.pop();
root = root->right;
}
}
}
// ( )
void BT_PostOrder(pTreeT root)
{
if (NULL != root)
{
BT_PostOrder(root->left);
BT_PostOrder(root->right);
visit(root);
}
}
// ( )
void BT_PostOrderNoRec(pTreeT root)
{
BT_Stack<treeT *> s;
pTreeT pre = NULL;
while ((NULL != root) || !s.empty())
{
if (NULL != root)
{
s.push(root);
root = root->left;
}
else
{
root = s.getTop();
if (root->right != NULL && pre != root->right)
{
root = root->right;
}
else
{
root = pre = s.getTop();
visit(root);
s.pop();
root = NULL;
}
}
}
}
//
void BT_LevelOrder(pTreeT root)
{
BT_Queue<treeT *> q;
treeT *treePtr;
assert( NULL != root );
q.push(root);
while (!q.empty())
{
treePtr = q.front->next->data;
q.pop();
visit(treePtr);
if (NULL != treePtr->left)
{
q.push(treePtr->left);
}
if (NULL != treePtr->right)
{
q.push(treePtr->right);
}
}
}
int main(int argc, char *argv[])
{
int i;
pTreeT root = NULL;
srand( (unsigned)time( NULL ) );
for (i=0; i<MAX_CNT; i++)
{
BT_Insert(rand() % BASE, &root);
}
//
printf("PreOrder:
");
BT_PreOrder(root);
printf("
");
printf("PreOrder no recursion:
");
BT_PreOrderNoRec(root);
printf("
");
//
printf("InOrder:
");
BT_InOrder(root);
printf("
");
printf("InOrder no recursion:
");
BT_InOrderNoRec(root);
printf("
");
//
printf("PostOrder:
");
BT_PostOrder(root);
printf("
");
printf("PostOrder no recursion:
");
BT_PostOrderNoRec(root);
printf("
");
//
printf("LevelOrder:
");
BT_LevelOrder(root);
printf("
");
system("pause");
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.