程序如下:
// 二叉树的建立。
//前序,中序,后序,广度的非递归程序实现。
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
enum Tags{Left,Right};
template <class Elem>
class TreeNode
{
public:
TreeNode* left;
TreeNode* right;
Elem data;
TreeNode(Elem dataval,TreeNode* leftval=NULL,TreeNode* rightval=NULL)
{
data=dataval;
left=leftval;
right=rightval;
}
TreeNode(TreeNode* leftval=NULL,TreeNode* rightval=NULL)
{
left=leftval;
right=rightval;
}
~TreeNode(){}
};
template<class Elem>
class StackElement
{
public:
TreeNode<Elem>* pointer;
Tags tag;
};
template<class Elem>
class BinTree
{
public:
BinTree()
{
init();
}
~BinTree()
{
DeleteTree(root);
}
//初始化根结点。
void init();
//后序递归删除二叉树。
void DeleteTree(TreeNode<Elem>*);
//有前序递归创建二叉树。
TreeNode<Elem>* Create();
//前序非递归遍历。
void PreOrder(TreeNode<Elem>*);
//中序非递归遍历。
void PreOrderWithoutRecusion(TreeNode<Elem>*);
//后序非递归遍历。
void InOrderWithoutRecusion(TreeNode<Elem>*);
//后序非递归遍历。另一种版本
void PostOrderWithoutRecusion(TreeNode<Elem>*);
//广度优先遍历。
void LevelOrder(TreeNode<Elem>*);
//操作函数。
void Massage(TreeNode<Elem>*);
//查找父亲结点
TreeNode<Elem>* GetParent(TreeNode<Elem>* root,TreeNode<Elem>* current);
//返回父亲结点的指针。
TreeNode<Elem>* Parent(TreeNode<Elem>* current);
private:
TreeNode<Elem>* root;
};
template<class Elem>
void BinTree<Elem>::init()
{
root=new TreeNode<Elem>;
}
template<class Elem>
void BinTree<Elem>::DeleteTree(TreeNode<Elem>* T)
{
if(T!=NULL)
{
DeleteTree(T->left);
DeleteTree(T->right);
delete T;
}
}
template<class Elem>
TreeNode<Elem>* BinTree<Elem>:: Create()
{
TreeNode<Elem>* T;
char ch;
cin>>ch;
if(ch=='#')
T=NULL;
else
{
T=new TreeNode<Elem>(ch,NULL,NULL);
T->left=Create();
T->right=Create();
}
return T;
}
template <class Elem>
void BinTree<Elem>::Massage(TreeNode<Elem>* T)
{
cout<<T->data<<" ";
}
template<class Elem>
void BinTree<Elem>::PreOrder(TreeNode<Elem>* T)
{
using std::stack;
stack<TreeNode<Elem>*> aStack;
TreeNode<Elem>* point=T;
while(!aStack.empty()||point!=NULL)
{
if(point!=NULL)
{
Massage(point);
aStack.push(point);
point=point->left;
}
else
{
point=aStack.top();
aStack.pop();
point=point->right;
}//end else
}//end while
}
template<class Elem>
void BinTree<Elem>::PreOrderWithoutRecusion(TreeNode<Elem>*T)
{
using std::stack;
stack<TreeNode<Elem>*> aStack;
TreeNode<Elem>* point=T;
while(point!=NULL||!aStack.empty())
{
if(point!=NULL)
{
aStack.push(point);
point=point->left;
}
else
{
point=aStack.top();
Massage(point);
point=point->right;
aStack.pop();
}//end else
}//end while
}
template<class Elem>
void BinTree<Elem>::InOrderWithoutRecusion(TreeNode<Elem>* T)
{
using std::stack;
StackElement<Elem> element;
stack<StackElement<Elem> > aStack;
TreeNode<Elem>* point;
if(T==NULL)
return;
else
point=T;
while(true)
{
//从左边进。
while(point!=NULL)
{
element.pointer=point;
element.tag=Left;
aStack.push(element);
point=point->left;
}
element=aStack.top();
aStack.pop();
point=element.pointer;
//从右边进。
while(element.tag==Right)
{
Massage(point);
if(aStack.empty())
return;
else
{
element=aStack.top();
aStack.pop();
point=element.pointer;
}//end else
}//end while
element.tag=Right;
aStack.push(element);
point=point->right;
}//end while
}
template<class Elem>
void BinTree<Elem>::PostOrderWithoutRecusion(TreeNode<Elem>* T)
{
using std::stack;
stack<TreeNode<Elem>*> aStack;
TreeNode<Elem> *p,*q;
if(T==NULL)
return;
p=T;
do
{
while(p!=NULL)
{
aStack.push(p);
p=p->left;
}
q=NULL;
while(!aStack.empty())
{
p=aStack.top();
aStack.pop();
if(p->right==q) //右子树为空或刚刚访问过。
{
Massage(p);
q=p;
}//end if
else
{
aStack.push(p);
p=p->right;
break;
}//end else
}//end while
}while(!aStack.empty());
}
template<class Elem>
void BinTree<Elem>::LevelOrder(TreeNode<Elem>* T)
{
using std::queue;
queue<TreeNode<Elem>*> aQueue;
TreeNode<Elem>* point=T;
if(point!=NULL)
aQueue.push(point);
while(!aQueue.empty())
{
point=aQueue.front();
Massage(point);
aQueue.pop();
if(point->left!=NULL)
aQueue.push(point->left);
if(point->right!=NULL)
aQueue.push(point->right);
}//end while
}
template<class Elem>
TreeNode<Elem>* BinTree<Elem>::GetParent(TreeNode<Elem>* root,
TreeNode<Elem>* current)
{
TreeNode<Elem>* temp;
if(root==NULL)
return NULL;
//找到父结点。
if(root->left==current || root->right==current)
return root;
//用递归找父结点。
if((temp=GetParent(root->left,current))!=NULL)
return temp;
else
return GetParent(root->right,current)
}
template<class Elem>
TreeNode<Elem>* BinTree<Elem>::Parent(TreeNode<Elem>* T)
{
if(current==NULL||current==T)
return NULL;
else
return GetParent(T,current);//递归调用函数找到父结点。
}
//主函数实现。
int main()
{
BinTree<char> A;
TreeNode<char> *Troot;
cout<<"输入字符串:#代表的是空树:"<<endl;
Troot=A.Create();
cout<<"前序遍历:";
A.PreOrder(Troot);
cout<<"/n中序遍历:";
A.PreOrderWithoutRecusion(Troot);
cout<<"/n后序遍历A:";
A.InOrderWithoutRecusion(Troot);
cout<<"/n后序遍历B: ";
A.PostOrderWithoutRecusion(Troot);
cout<<"/n广度优先遍历:";
A.LevelOrder(Troot);
cout<<endl;
return 0;
}
//输入:
// 输入字符串:#代表的是空树:
// a
// b
// c
// #
// #
// d
// e
// #
// g
// #
// #
// f
// #
// #
// #
//输出样例:
//前序遍历:a b c d e g f
//中序遍历:c b e g d f a
//后序遍历A:c g e f d b a
//后序遍历B: c g e f d b a
//广度优先遍历:a b c d e f g
//程序结束。
我这里写出来。对与那些还没有理解和不知道怎么编写整个程序的同学借鉴和学习。