第六章:二叉树

  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*

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1) 问题描述 天然气经过管道网络从其生产基地输送到消耗地,在传输过程中,其性能的某一个或几个方面可能会有所衰减(例如气压)。为了保证信号衰减不超过容忍值,应在网络中的合适位置放置放大器以增加信号(例如电压)使其与源端相同。设计算法确定把信号放大器放在何处,能使所用的放大器数目最少并且保证信号衰减不超过给定的容忍值。 2) 基本要求 (1) 建立模型,设计数据结构; (2) 设计算法完成放大器的放置; (3) 分析算法的时间复杂度。 3) 设计思想 为了简化问题,假设分布网络是二叉树结构,源端是树的根结点,信号从一个结点流向其孩子结点,树中的每一结点(除了根)表示一个可以用来放置放大器的位置。图5是一个网络示意图,边上标出的是从父结点到子结点的信号衰减量。 对于网络中任一结点i,设d(i)表示结点i与其父结点间的衰减量,D(i)为从结点i到结点i的子树中任一叶子结点的衰减量的最大值,并有如下递推公式: 在此公式中,要计算某结点的D值,必须先计算其孩子结点的D值,因而必须后序遍历二叉树,当访问一个结点时,计算其D值。 例如,D(B)=max{D(D)+d(D),D(E)}=4,若容忍值为3,则在B点或其祖先的任意一点放置放大器,并不能减少B与其后代的衰减量,必须在D点放置一个放大器或在其孩子结点放置一个或多个放大器。若在结点D 处放置一个放大器,则D(B)=2。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值