先序、中序、后序遍历主要依靠递归来实现
广度优先搜索主要依靠队列(先进先出),深度优先依靠栈(先进后出)


#include<iostream>
using namespace std;
template<class T>
struct Node {
T data;
Node<T> *next;
};
template<class T>
class LinkStack {
private:
Node<T> *top;
public:
LinkStack();
~LinkStack();
void Push(T x);
T Pop();
T Top();
bool Empty();
};
template<class T>
LinkStack<T>::LinkStack()
{
top = NULL;
}
template<class T>
LinkStack<T>::~LinkStack()
{
Node<T> *p = top;
while (p)
{
Node<T> *q = p;
p = p->next;
delete q;
}
top = NULL;
}
template<class T>
void LinkStack<T>::Push(T x)
{
Node<T> *s = new Node<T>();
s->data = x;
s->next = top;
top = s;
}
template<class T>
T LinkStack<T>::Pop()
{
T x;
if (top == NULL)
{
cout << "下溢" << endl;
exit(1);
}
x = top->data;
Node<T> *p = top;
top = top->next;
delete p;
return x;
}
template<class T>
T LinkStack<T>::Top()
{
if (top == NULL)
{
cout << "下溢" << endl;
exit(1);
}
return top->data;
}
template<class T>
bool LinkStack<T>::Empty()
{
return top == NULL;
}


#include<iostream>
using namespace std;
template<class T>
struct QNode {
T data;
QNode *next;
};
template<class T>
class LinkQueue {
private:
QNode<T> *front, *rear;
public:
LinkQueue();
~LinkQueue();
void EnQueue(T x);
T DeQueue();
T GetQueue();
bool Empty();
void print();
};
template<class T>
LinkQueue<T>::~LinkQueue()
{
rear = front = NULL;
}
template<class T>
void LinkQueue<T>::print()
{
if (Empty())
{
cout << "队列为空!" << endl;
}
else
{
QNode<T> *p = front->next;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
}
cout << endl;
}
template<class T>
LinkQueue<T>::LinkQueue()
{
QNode<T> *s = new QNode<T>();
s->next = NULL;
front = rear = s;
}
template<class T>
T LinkQueue<T>::DeQueue()
{
if (rear == front)
{
cout << "下溢" << endl; //即队列为空
exit(1);
}
QNode<T> *p = front->next;
T x = p->data;
front->next = p->next;
if (p->next == NULL)
{
rear = front;
}
delete p;
return x;
}
template<class T>
T LinkQueue<T>::GetQueue()
{
if (rear == front)
{
cout << "下溢" << endl; //即队列为空
exit(1);
}
return front->next->data;
}
template<class T>
void LinkQueue<T>::EnQueue(T x)
{
QNode<T> *s = new QNode<T>();
s->data = x;
s->next = NULL;
rear->next = s;
rear = s;
}
template<class T>
bool LinkQueue<T>::Empty()
{
return rear == front;
}
这两个其实主要是类的定义不同,但struct的定义是一样的,所以可以自己优化一下。
当然也可以直接调用c++标准库里的<stack> <queue> 都是可以直接使用的,在文章最后会放出标准代码,与上面的代码函数定义名称稍有不同。
#include<iostream>
#include<cstring>
#include"Stack.h"
#include"Queue.h"
using namespace std;
template<class T>
struct BTNode {
T data;
BTNode<T> *lchild, *rchild;
};
template<class T>
class BTree {
private:
BTNode<T> *root;
void pre_Order(BTNode<T> * t);
void in_Order(BTNode<T> * t);
void post_Order(BTNode<T> * t);
void depthFirstSearch(BTNode<T> * t);
void breadthFirstSearch(BTNode<T> *t);
BTNode<T>* create(char s[],int &pos);
public:
int length;
void createBiTree();
void preOrder();
void inOrder();
void postOrder();
void DepthFirstSearch();
void BreadthFirstSearch();
};
template<class T>
void BTree<T>::breadthFirstSearch(BTNode<T> *t)
{
LinkQueue<BTNode<T>*> nodeQueue;
nodeQueue.EnQueue(t);
while (!nodeQueue.Empty())
{
BTNode<T> *node = nodeQueue.GetQueue();
cout << node->data << ' ';
nodeQueue.DeQueue();
if (node->lchild)
{
nodeQueue.EnQueue(node->lchild);
}
if (node->rchild)
{
nodeQueue.EnQueue(node->rchild);
}
}
}
template<class T>
void BTree<T>::BreadthFirstSearch()
{
cout << "广度优先搜索:";
breadthFirstSearch(root);
cout << endl;
}
template<class T>
void BTree<T>::depthFirstSearch(BTNode<T> *t)
{
LinkStack <BTNode<T>*> nodeStack;
nodeStack.Push(t);
while (!nodeStack.Empty())
{
BTNode<T> *node = nodeStack.Top();
cout << node->data << ' ';
nodeStack.Pop();
if (node->rchild)
{
nodeStack.Push(node->rchild);
}
if (node->lchild)
{
nodeStack.Push(node->lchild);
}
}
}
template<class T>
void BTree<T>::DepthFirstSearch()
{
cout << "深度优先搜索:";
depthFirstSearch(root);
cout << endl;
}
template<class T>
BTNode<T>* BTree<T>::create(char s[], int &pos)
{
++pos;
BTNode<T> *p;
if (pos >= length)
{
return NULL;
}
else
{
if (s[pos] == '#')
{
p = NULL;
}
else
{
p = new BTNode<T>();
p->data = s[pos];
p->lchild = create(s,pos);
p->rchild = create(s,pos);
}
return p;
}
}
template<class T>
void BTree<T>::in_Order(BTNode<T> *t)
{
if (t != NULL)
{
in_Order(t->lchild);
cout << t->data << " ";
in_Order(t->rchild);
}
}
template<class T>
void BTree<T>::post_Order(BTNode<T> *t)
{
if (t != NULL)
{
post_Order(t->lchild);
post_Order(t->rchild);
cout << t->data << " ";
}
}
template<class T>
void BTree<T>::pre_Order(BTNode<T> *t)
{
if (t != NULL)
{
cout << t->data << " ";
pre_Order(t->lchild);
pre_Order(t->rchild);
}
}
template<class T>
void BTree<T>::createBiTree()
{
cout << "请按照先序方式输入要创建的二叉树,#表示为空" << endl;
int pos = -1;
char str[50];
cin >> str;
length = strlen(str);
root = create(str,pos);
cout << "先序创建二叉树成功!" << endl;
}
template<class T>
void BTree<T>::preOrder()
{
cout << "先序遍历:";
pre_Order(root);
cout << endl;
}
template<class T>
void BTree<T>::inOrder()
{
cout << "中序遍历:";
in_Order(root);
cout << endl;
}
template<class T>
void BTree<T>::postOrder()
{
cout << "后序序遍历:";
post_Order(root);
cout << endl;
}
int main()
{
BTree<char> test;
test.createBiTree();
test.preOrder();
test.inOrder();
test.postOrder();
test.DepthFirstSearch();
test.BreadthFirstSearch();
system("pause");
return 0;
}
//ABD##EF##G##C#H##


#include<iostream>
#include<cstring>
#include<stack>
#include<queue>
using namespace std;
template<class T>
struct BTNode {
T data;
BTNode<T> *lchild, *rchild;
};
template<class T>
class BTree {
private:
BTNode<T> *root;
void pre_Order(BTNode<T> * t);
void in_Order(BTNode<T> * t);
void post_Order(BTNode<T> * t);
void depthFirstSearch(BTNode<T> * t);
void breadthFirstSearch(BTNode<T> *t);
BTNode<T>* create(char s[],int &pos);
public:
int length;
void createBiTree();
void preOrder();
void inOrder();
void postOrder();
void DepthFirstSearch();
void BreadthFirstSearch();
};
template<class T>
void BTree<T>::breadthFirstSearch(BTNode<T> *t)
{
queue<BTNode<T>*> nodeQueue;
nodeQueue.push(t);
while (!nodeQueue.empty())
{
BTNode<T> *node = nodeQueue.front();
cout << node->data << ' ';
nodeQueue.pop();
if (node->lchild)
{
nodeQueue.push(node->lchild);
}
if (node->rchild)
{
nodeQueue.push(node->rchild);
}
}
}
template<class T>
void BTree<T>::BreadthFirstSearch()
{
cout << "广度优先搜索:";
breadthFirstSearch(root);
cout << endl;
}
template<class T>
void BTree<T>::depthFirstSearch(BTNode<T> *t)
{
stack<BTNode<T>*> nodeStack;
nodeStack.push(t);
while (!nodeStack.empty())
{
BTNode<T> *node = nodeStack.top();
cout << node->data << ' ';
nodeStack.pop();
if (node->rchild)
{
nodeStack.push(node->rchild);
}
if (node->lchild)
{
nodeStack.push(node->lchild);
}
}
}
template<class T>
void BTree<T>::DepthFirstSearch()
{
cout << "深度优先搜索:";
depthFirstSearch(root);
cout << endl;
}
template<class T>
BTNode<T>* BTree<T>::create(char s[], int &pos)
{
++pos;
BTNode<T> *p;
if (pos >= length)
{
return NULL;
}
else
{
if (s[pos] == '#')
{
p = NULL;
}
else
{
p = new BTNode<T>();
p->data = s[pos];
p->lchild = create(s,pos);
p->rchild = create(s,pos);
}
return p;
}
}
template<class T>
void BTree<T>::in_Order(BTNode<T> *t)
{
if (t != NULL)
{
in_Order(t->lchild);
cout << t->data << " ";
in_Order(t->rchild);
}
}
template<class T>
void BTree<T>::post_Order(BTNode<T> *t)
{
if (t != NULL)
{
post_Order(t->lchild);
post_Order(t->rchild);
cout << t->data << " ";
}
}
template<class T>
void BTree<T>::pre_Order(BTNode<T> *t)
{
if (t != NULL)
{
cout << t->data << " ";
pre_Order(t->lchild);
pre_Order(t->rchild);
}
}
template<class T>
void BTree<T>::createBiTree()
{
cout << "请按照先序方式输入要创建的二叉树,#表示为空" << endl;
int pos = -1;
char str[50];
cin >> str;
length = strlen(str);
root = create(str,pos);
cout << "先序创建二叉树成功!" << endl;
}
template<class T>
void BTree<T>::preOrder()
{
cout << "先序遍历:";
pre_Order(root);
cout << endl;
}
template<class T>
void BTree<T>::inOrder()
{
cout << "中序遍历:";
in_Order(root);
cout << endl;
}
template<class T>
void BTree<T>::postOrder()
{
cout << "后序序遍历:";
post_Order(root);
cout << endl;
}


int main()
{
BTree<char> test;
test.createBiTree();
test.preOrder();
test.inOrder();
test.postOrder();
test.DepthFirstSearch();
test.BreadthFirstSearch();
system("pause");
return 0;
}
测试输入:ABD##EF##G##C#H##
结果
请按照先序方式输入要创建的二叉树,#表示为空
ABD##EF##G##C#H##
先序创建二叉树成功!
先序遍历:A B D E F G C H
中序遍历:D B F E G A C H
后序序遍历:D F G E B H C A
深度优先搜索:A B D E F G C H
广度优先搜索:A B C D E H F G
来源:oschina
链接:https://my.oschina.net/u/4408791/blog/3746035