//***********************************BinaryTree.h********************************************
//此代码只实现了二叉树先序遍历的递归以及非递归算法,再就是层次遍历算法
#include <iostream>
#include <stack> //调用STL中的stack模板类
#include <queue>
using namespace std;
template <class T>
class BinaryTree;
template <class T>
class TreeNode
{
friend class BinaryTree<T>;
private:
TreeNode<T> *left,*right;
T data;
public:
TreeNode(T d,TreeNode<T> *l=NULL,TreeNode<T> *r=NULL):data(d),left(l),right(r){}
};
template <class T>
class BinaryTree
{
private:
TreeNode<T> *root; //二叉树的根节点
public:
BinaryTree() //构造函数
{
root=createTree();
}
~BinaryTree() //析构函数
{
cout<<"调用析构函数!"<<endl;
clearTree(root); //调用清空二叉树函数
}
TreeNode<T>* createTree() //先序递归创建二叉树
{
static int i=1;
TreeNode<T>* Root;
cout<<"请输入二叉树的先序遍历的第"<<i++<<"个值:";
T info;
cin>>info;
if(info!='#') //叶子节点控制符
{
Root=new TreeNode<T>(info);
Root->left=createTree();
Root->right=createTree();
}
else
Root=NULL;
return Root;
}
void preOrderI(TreeNode<T> *Root) //先序递归遍历二叉树并输出
{
if(Root!=NULL)
{
cout<<Root->data<<" ";
preOrderI(Root->left);
preOrderI(Root->right);
}
else //二叉树为空时
{
if(root==NULL)
{
cout<<"二叉树为空"<<endl;
}
}
//cout<<endl;
}
void preOrderII() //非递归先序遍历二叉树
{
stack<TreeNode<T>*> Stack;
TreeNode<T>* Root;
Stack.push(root);
while(!Stack.empty())
{
Root=Stack.top();
Stack.pop();
cout<<Root->data<<" ";
if(Root->right!=NULL)
Stack.push(Root->right);
if(Root->left!=NULL)
Stack.push(Root->left);
}
}
void levelOrder()
{
queue<TreeNode<T>*> Queue;
TreeNode<T> *Root;
Queue.push(root);
while(!Queue.empty())
{
Root=Queue.front();
Queue.pop();
cout<<Root->data<<" ";
if(Root->left!=NULL)
Queue.push(Root->left);
if(Root->right!=NULL)
Queue.push(Root->right);
}
}
void clearTree(TreeNode<T>* Root) //清空二叉树,root=NULL
{
removeNode(Root);
root=NULL;
}
void removeNode(TreeNode<T> *Root) //包括根节点在内的子节点全部删除
{
if(Root!=NULL)
{
removeNode(Root->left);
removeNode(Root->right);
delete Root;
}
}
TreeNode<T>* getRoot() //得到二叉树的根节点
{
return root;
}
};
//*********************************main.cpp*****************************************
#include "stdafx.h"
#include "iostream"
#include "BinaryTree.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
BinaryTree<char> myTree;
cout<<"***递归先序输出***"<<endl;
myTree.preOrderI(myTree.getRoot());
cout<<endl;
cout<<"***非递归先序输出***"<<endl;
myTree.preOrderII();
cout<<endl;
cout<<"****广度优先遍历****"<<endl;
myTree.levelOrder();
cout<<endl;
cout<<"*****清空*****"<<endl;
myTree.clearTree(myTree.getRoot());
myTree.preOrderI(myTree.getRoot());
cout<<endl;
cout<<"*****析构*****"<<endl;
return 0;
}