//***********************************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;
}