二叉树的递归与非递归遍历

来源:互联网 发布:wps表格查找相同数据 编辑:程序博客网 时间:2024/06/05 02:44
#include<iostream>
#include<list>
#include<assert.h>
#include<stack>
using namespace std;
enum style {Pre, In, Post};
template<typename T>
struct BiTNode
{
T data;
BiTNode<T> *ichild, *rchild;
};
template<typename T>
class BiTree
{
private:
void DestoryBiTree(BiTNode<T> * &t)
{
if(t != NULL)
{
DestoryBiTree(t->ichild);
DestoryBiTree(t->rchild);
delete t;
t = NULL;
}
}
public:
BiTree()
{
root = NULL;
}
~BiTree()
{
DestoryBiTree(root);
}
void CreateBiTree()
{
T e;
cin>>e;
if(e == '#')
{
return ;
}
root = new BiTNode<T>;
assert(root != NULL);
root->data = e;
cout<<root->data;
BiTree<T> left,right;
left.CreateBiTree();
right.CreateBiTree();
root->ichild = left.root;
left.root = NULL;


root->rchild = right.root;
right.root = NULL;
}
int BiTreeDepth(BiTNode<T>* t)const
{
int i,j;
if(t == NULL)
{
return 0;
}
else
{
i = BiTreeDepth(t->ichild);
j = BiTreeDepth(t->rchild);
return i>j?i+1:j+1;
}
}
BiTNode<T> *Root()
{
return root;
}
void PreOrderTraverse(void (*Visit)(BiTNode<T> *))const
{
stack<BiTNode<T> *> s;
BiTNode<T> *t = root;
s.push(NULL);
while(t != NULL)
{
Visit(t);
if(t->rchild != NULL)
s.push(t->rchild);
if(t->ichild != NULL)
t = t->ichild;
else
{
t = s.top();
s.pop();
}
}


}
void OrderTraverse(BiTNode<T> *t ,style mode,void(*Visit)(BiTNode<T>*))const
{
if(t !=NULL)
{
if(mode == Pre)
{
Visit(t);
OrderTraverse(t->ichild,mode,Visit);
}
if(mode == In)
{
Visit(t);
OrderTraverse(t->rchild,mode,Visit);
}
if(mode == Post)
{
Visit(t);
}
}
};
protected:
BiTNode<T> *root;
};
template<typename T>
void Visit(BiTNode<T> *c)
{
cout<<c->data<<' ';
}
int main()
{
BiTree<char> t,c;
t.CreateBiTree();
t.BiTreeDepth(t.Root());
t.OrderTraverse(t.Root(),Pre,Visit);
t.PreOrderTraverse(Visit);
return 0;
}
0 0
原创粉丝点击