这里创建二叉树运用了即遍历,都进行了函数的重载,并且遍历的时候,只是顺序的改变;
难点:层次遍历的方法,在这里进行了一下总结。其中包括vector , queue, deque, 等多种方法:
#include "iostream"
#include "vector"
#include "malloc.h"
#include "queue"
using namespace std;
//二叉树 //先序顺序进行创建
template<class Object>
class BinaryNode;
template<class Object>
class BinaryTree
{
private:
BinaryNode<Object> *root; //想要对private进行创建,建立一个重载的函数
public:
BinaryTree()
{
root = 0;
}
~BinaryTree()
{
delete root;
}
void create();
bool create(BinaryNode<Object> *&T); //define 构造二叉树 //递归创建
//先序,中序,后序,只是输出顺序不同,在操作中递归排列输出顺序。
void preOrderTraverse();
void inOrderTraverse();
void postOrderTraverse();
void levelOrderTraverse();
void pirntBFS();
void printBFS_();
void printNodeByLevel();
void printNodeByLevel_();
bool preOrderTraverse(BinaryNode<Object> *T); //还可以将遍历完的结点加入到队列中,最后输出。这样就遍历完毕
bool inOrderTraverse(BinaryNode<Object> *T);
bool postOrderTraverse(BinaryNode<Object> *T);
bool levelOrderTraverse(BinaryNode<Object> *T);
void pirntBFS(BinaryNode<Object> *root);
void printBFS_(BinaryNode<Object> *root);
void printNodeByLevel(BinaryNode<Object> *root);
void printNodeByLevel_(BinaryNode<Object> *root);
void *operator new(size_t size);
void operator delete(void *p);
};
template<class Object>
void* BinaryTree<Object>::operator new(size_t size)
{
void *p = malloc(size);
return p;
}
template<class Object>
void BinaryTree<Object>::operator delete(void *p)
{
free(p);
}
//typedef char Object;
template<class Object>
class BinaryNode
{
friend class BinaryTree<Object>;
private:
Object elem;
BinaryNode *leftChild;
BinaryNode * rightChild;
};
template<class Object>
void BinaryTree<Object>::create()
{
create(root);
}
template<class Object>
bool BinaryTree<Object>::create(BinaryNode<Object> *&T) //指针申请的内存,所以用指向指针的指针或引用
{
cout << "enter the value of the elem:";
Object x;
cin >> x;
if(x == '#') {T = NULL; delete T;}
else
{
T = new BinaryNode<Object>; //对外不起作用, //指针参数是如何传递内存的。除非使用指向指针的引用
T->elem = x;
create(T->leftChild);
create(T->rightChild);
}
return true;
}
template<class Object>
void BinaryTree<Object>::preOrderTraverse()
{
cout << "the preOrder: ";
preOrderTraverse(root);
cout << endl;
}
template<class Object>
bool BinaryTree<Object>::preOrderTraverse(BinaryNode<Object> *T)
{
if(T != NULL)
{
cout << T->elem << " ";
preOrderTraverse(T->leftChild);
preOrderTraverse(T->rightChild);
}
return true;
}
template<class Object>
void BinaryTree<Object>::inOrderTraverse()
{
cout << "the inOrder: ";
inOrderTraverse(root);
cout << endl;
}
template<class Object>
bool BinaryTree<Object>::inOrderTraverse(BinaryNode<Object> *T)
{
if(T != NULL)
{
inOrderTraverse(T->leftChild);
cout << T->elem << " ";
inOrderTraverse(T->rightChild);
}
return true;
}
template<class Object>
void BinaryTree<Object>::postOrderTraverse()
{
cout << "the postOrder: ";
postOrderTraverse(root);
cout << endl;
}
template<class Object>
bool BinaryTree<Object>::postOrderTraverse(BinaryNode<Object> *T)
{
if(T != NULL)
{
postOrderTraverse(T->leftChild);
postOrderTraverse(T->rightChild);
cout << T->elem << " ";
}
return true;
}
/*************************************************************************************************************/
//按层次遍历的几种方法
//method1:
//层次遍历的vector存储模型
template<class Object>
void BinaryTree<Object>::levelOrderTraverse()
{
cout << "the levelOrder: ";
levelOrderTraverse(root);
}
template<class Object>
bool BinaryTree<Object>::levelOrderTraverse(BinaryNode<Object> *T)
{
vector<BinaryNode<Object>*> Node; //注意定义是结点指针
if(T != NULL)
{
Node.push_back(T);
int cur = 0;
int last = 1;
while(cur < Node.size())
{
last = Node.size();
while(cur < last)
{
cout << Node[cur]->elem << " ";
if(Node[cur]->leftChild)
Node.push_back(Node[cur]->leftChild);
if(Node[cur]->rightChild)
Node.push_back(Node[cur]->rightChild);
cur++;
}
}
cout << endl;
}
return true;
}
//method2:
//利用queue双向队列进行实现,
template<class Object>
void BinaryTree<Object>::printBFS_()
{
cout << "the level order: ";
printBFS_(root);
}
template<class Object>
void BinaryTree<Object>::printBFS_(BinaryNode<Object> *root)
{
queue<BinaryNode<Object> *> Node;
Node.push(root);
do
{
BinaryNode<Object> *node = Node.front(); //第一个结点
Node.pop();
cout << node->elem << " ";
if(node->leftChild)
Node.push(node->leftChild);
if(node->rightChild)
Node.push(node->rightChild);
}
while(!Node.empty());
}
//mothod3:
//换行
template<class Object>
void BinaryTree<Object>::printNodeByLevel_()
{
cout << "the level order: ";
printNodeByLevel_(root);
}
template<class Object>
void BinaryTree<Object>::printNodeByLevel_(BinaryNode<Object> *root)
{
deque<BinaryNode<Object> *>Q1, Q2;
Q1.push_back(root);
do
{
do
{
BinaryNode<Object>* node = Q1.front();
Q1.pop_front();
cout << node->elem << " ";
if(node->leftChild)
Q2.push_back(node->leftChild);
if(node->rightChild)
Q2.push_back(node->rightChild);
}while(!Q1.empty());
cout << endl;
Q1.swap(Q2); //exchange the node
}while(!Q1.empty());
}
//method 4:
template<class Object>
void BinaryTree<Object>::printNodeByLevel()
{
cout << "the level order: ";
printNodeByLevel(root);
}
template<class Object>
void BinaryTree<Object>::printNodeByLevel(BinaryNode<Object> *root)
{
queue<BinaryNode<Object> *> Q;
Q.push(root);
Q.push(0);
do
{
BinaryNode<Object> *node = Q.front();
Q.pop();
if(node)
{
cout << node->elem << " ";
if(node->leftChild)
Q.push(node->leftChild); //左压入,没有递归哦
if(node->rightChild)
Q.push(node->rightChild); //右压入
}
else if(!Q.empty()) //当发现空指针(结束信号)时,要检查队列内是否还有节点,如果没有的话还插入新的结束信号,则会做成死循环
{
Q.push(0);
cout << endl;
}
}while(!Q.empty());
}
//method5:
//多加一个level 成员
template<class Object>
void BinaryTree<Object>::pirntBFS()
{
cout << "the level order: ";
pirntBFS(root);
}
template<class Object>
void BinaryTree<Object>::pirntBFS(BinaryNode<Object> *root)
{
queue<BinaryNode<Object> *> Q;
Q.push(root);
int curlevel = 0;
do
{
BinaryNode<Object> *node = Q.front();
int level = node->level;
Q.pop();
cout << node->elem << " ";
if(node->leftChild)
{
node->leftChild.level = level + 1;
Q.push(node->leftChild);
}
if(node->rightChild)
{
node->rightChild.level = level + 1;
Q.push(node->rightChild);
}
}
while(!Q.empty());
}
/****************************************************************************************************************/
int main()
{
BinaryTree<char> tree;
tree.create();
tree.preOrderTraverse(); //先序遍历
tree.inOrderTraverse(); //中序遍历
tree.postOrderTraverse(); //后序遍历
tree.levelOrderTraverse();//层次遍历
tree.printNodeByLevel();
cin.get();
cin.get();
return 0;
}