这个程序有参考了网上的程序,谢谢。
这个程序自己重新参考数据结构,重新栈和队列的模板类,并参考网上的程序写出了二叉树的建立和三种遍历方式(包括递归和非递归的实现):
队列的实现:
#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\n", 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:\n");
BT_PreOrder(root);
printf("\n");
printf("PreOrder no recursion:\n");
BT_PreOrderNoRec(root);
printf("\n");
//中序
printf("InOrder:\n");
BT_InOrder(root);
printf("\n");
printf("InOrder no recursion:\n");
BT_InOrderNoRec(root);
printf("\n");
//后序
printf("PostOrder:\n");
BT_PostOrder(root);
printf("\n");
printf("PostOrder no recursion:\n");
BT_PostOrderNoRec(root);
printf("\n");
//层序
printf("LevelOrder:\n");
BT_LevelOrder(root);
printf("\n");
system("pause");
return 0;
}