1.基础知识:二叉树是一种非线性结构,而前面讨论的都是线性结构,两种是有本质区别的。它在现实社会中存在着很多的模型。例如,人类社会的族谱,社会的各种组织分层,国家,学校,单位的各种机构,这些都是用树和二叉树来表示的。其中二叉树相当的实用。我为什么这么说呢,因为二叉树很有规则性,它的一系列操作都是相当有规律的,操作相对来讲比较简单,而其他的树则较二叉树要复杂得多,并且各个分支之间都没有固定的规律可循。
2.二叉树的代码实现:
///
// Book name : C++ structure and algorithm
// FileName : BiTree.cpp
// Version : 1.0
// Author : Yangfei
// Date : 2010-4-26 21:08:55
// Comment : 二叉树类实现,应用:哈夫曼编码,数学表达式计算,设置信号放大器,在线等价类
//
///
//二叉树类模板定义
template <class T>
class BiTree
{
friend void visit(BiTree<T> *t);
friend void preOder_recursive(BiTree<T> *t);
friend void InOder_recursive(BiTree<T> *t);
friend void PostOder_recursive(BiTree<T> *t);
friend void CreateBiTree(BiTree<T>* &BiTreeNode);
public:
BiTree<T> *lChild;
BiTree<T> *rChild;
T data;
public:
BiTree()
{
lChild=rChild=NULL;
}
//void CreateBiTree(BiTree<T>* BiTreeNode);
};
BiTree<char> *head=NULL;
//访问结点数据函数模板
template <class T>
void visit(BiTree<T> *t)
{
if(t)
{
cout<<t->data<<" ";
}
}
//先序创建一棵二叉树
template <class T>
void CreateBiTree(BiTree<T>* &BiTreeNode)
{
T ch;
cin>>ch;
if(ch=='#')
BiTreeNode=NULL;
else
{
BiTreeNode=new BiTree<T>();
if(head==NULL)
head=BiTreeNode;
BiTreeNode->data=ch;
CreateBiTree<T>(BiTreeNode->lChild);
CreateBiTree<T>(BiTreeNode->rChild);
}
}
//递归方式遍历二叉树:先序,中序,后序
//先序遍历二叉树
template <class T>
void preOder_recursive(BiTree<T> *t)
{
if(t)
{
visit<T>(t);
preOder_recursive<T>(t->lChild);
preOder_recursive<T>(t->rChild);
}
}
//中序遍历二叉树
template <class T>
void InOder_recursive(BiTree<T> *t)
{
if(t)
{
cout<<"(";
InOder_recursive<T>(t->lChild);
visit<T>(t);
InOder_recursive<T>(t->rChild);
cout<<")";
}
}
//后序遍历二叉树
template <class T>
void PostOder_recursive(BiTree<T> *t)
{
if(t)
{
PostOder_recursive<T>(t->lChild);
::PostOder_recursive<T>(t->rChild);
visit<T>(t);
}
}
int main()
{
//二叉树测试
BiTree<char> *p_Root=NULL;
BiTree<int> *lchild=new BiTree<int>();
BiTree<int> *rchild=new BiTree<int>();
p_Root->data=1;
p_Root->lChild=lchild;
p_Root->rChild=rchild;
lchild->data=2;
rchild->data=3;
CreateBiTree<char>(p_Root);
//visit<int>(lchild);
preOder_recursive<char>(head);
cout<<endl;
InOder_recursive<char>(head);
cout<<endl;
PostOder_recursive<char>(head);
cout<<endl;
return 0;
}
3.二叉树的应用
二叉树的应用相当的多,哈夫曼编码,数学表达式计算,设置信号放大器,在线等价类等等,这些都是二叉树的应用。其中哈夫曼编码算法在数据结构与算法这门课程中,那是相当经典的算法。如果不实现这个算法,个人认为基本上跟没学习二叉树这种数据结构。还有数学表达式求解的问题也是,总之用二叉树这种数据结构可实现很多的经典算法。下面是一个用二叉树,如何表达了一个算术表达式的例子,这是一棵深度为2的二叉树,根结点为*,输出的结果如下所示:
(*)
/ /
(a) (b)
这棵树的叶子数:2
这棵树的深度是:1
先序遍历:*ab
中序遍历:a*b
后序遍历:ab*