第六章:二叉树

  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 BiTree
{
 friend void visit(BiTree *t);
 friend void preOder_recursive(BiTree *t);
 friend void InOder_recursive(BiTree *t);
 friend void PostOder_recursive(BiTree *t);
 friend void CreateBiTree(BiTree* &BiTreeNode);
 
public:
 BiTree *lChild;
 BiTree *rChild;
 T data;
public:
 BiTree()
 {
  lChild=rChild=NULL;
 }
 //void CreateBiTree(BiTree* BiTreeNode);

};

BiTree *head=NULL;
//访问结点数据函数模板
template
void visit(BiTree *t)
{
 if(t)
 {
  cout<data<<" ";
 }
}


//先序创建一棵二叉树
template
void CreateBiTree(BiTree* &BiTreeNode)
{
 T ch;
 cin>>ch;
 if(ch=='#')
  BiTreeNode=NULL;
 else
 {
  BiTreeNode=new BiTree();
  if(head==NULL)
   head=BiTreeNode;
  BiTreeNode->data=ch;
  CreateBiTree(BiTreeNode->lChild);
  CreateBiTree(BiTreeNode->rChild);
 }

 
}

//递归方式遍历二叉树:先序,中序,后序
//先序遍历二叉树
template
void preOder_recursive(BiTree *t)
{
 if(t)
 {
  visit(t);
  preOder_recursive(t->lChild);
  preOder_recursive(t->rChild);
 }
}

//中序遍历二叉树
template
void InOder_recursive(BiTree *t)
{
 if(t)
 {
  cout<<"(";
  InOder_recursive(t->lChild);
  visit(t);
  InOder_recursive(t->rChild);
  cout<<")";
 }
}

//后序遍历二叉树
template
void PostOder_recursive(BiTree *t)
{
 if(t)
 {
  PostOder_recursive(t->lChild);
  ::PostOder_recursive(t->rChild);
  visit(t);
 }
}

 

 

 

int main()
{

 

 

     //二叉树测试
 BiTree *p_Root=NULL;
 BiTree *lchild=new BiTree();
 BiTree *rchild=new BiTree();
 
 p_Root->data=1;
 p_Root->lChild=lchild;
 p_Root->rChild=rchild;
 lchild->data=2;
 rchild->data=3;
 CreateBiTree(p_Root);
 //visit(lchild);
 preOder_recursive(head);
 cout< InOder_recursive(head);
 cout< PostOder_recursive(head);
 cout<

     return 0;
}

    3.二叉树的应用

  二叉树的应用相当的多,哈夫曼编码,数学表达式计算,设置信号放大器,在线等价类等等,这些都是二叉树的应用。其中哈夫曼编码算法在数据结构与算法这门课程中,那是相当经典的算法。如果不实现这个算法,个人认为基本上跟没学习二叉树这种数据结构。还有数学表达式求解的问题也是,总之用二叉树这种数据结构可实现很多的经典算法。下面是一个用二叉树,如何表达了一个算术表达式的例子,这是一棵深度为2的二叉树,根结点为*,输出的结果如下所示:

   (*)
  /   /
(a)    (b)

这棵树的叶子数:2
这棵树的深度是:1
先序遍历:*ab
中序遍历:a*b
后序遍历:ab*

你可能感兴趣的:(数据结构与算法)