数据结构——二叉树

                               数据结构——二叉树

  (一)定义和性质

     1.定义:二叉树(形)是结点的有限集合,它或者是空集,或者由一个根及两个不相交的称为这个根的左、右子树形的二叉树组成。 

     2.特征:①  二叉树每个结点最多有2个子结点; ②  二叉树的子树有左右之分。

               二叉树的五种不同形态:

     3.树和二叉树的区别:

          ⑴ 二叉树中结点的子树分成左子树和右子树,即使某结点只有一棵子树,也要指明该子树是左子树,还是右子树,就是说二叉树是有序的;
          ⑵ 树决不能为空(换言之树不能为空集),即它至少有一个结点,而一棵二叉树可以是空的(或者说二叉树可以为空集)。

      4.二叉树的性质:

            a.二叉树中层数为i的结点至多有个,i≧0。

            b.高度为k的二叉树中至多有     (k≧0)个结点。

            c.设T是由n个结点构成的二叉树,其中,叶子结点个数为n0,度为2的结点个数为n2,则有:n0=n2+1
证明:若设度为1的结点有n1个,总结点个数为n,总边数为e,则 n=n0+n1+n2

      5.满二叉树:一棵非空高度为k( k  0)的满二叉树,是有个结点的二叉树

                      满二叉树的特点是:① 叶结点都在第k层上;② 每个分支结点都有两个子结点;③ 叶结点的个数等于非叶结点个数加1。 

      6.完全二叉树:一棵包含n个结点高度为k的二叉树T,当按层次顺序编号T的所有结点,对应于一棵高度为k的满二叉树中编号由1至n的那些结点时,T被称为完全二叉树

                     具有n个结点高度为k的完全二叉树的特点是: 
                                  ⑴ 树中只有最下面两层结点的度可以小于2; 
                                  ⑵ 树中最下面一层的结点都集中在该层最左边的若干位置上(满二叉树意义上); 
                                  ⑶ 树中叶结点只能在层数最大的两层上出现,即存在一个非负整数k使得树中每个叶结点或在第k层或第k+1层上;
                                  ⑷ 对树中所有结点,按层次顺序,用自然数从1开始编号,仅仅编号最大的非叶结点可以没有右孩子,其余非叶结点都有两个孩子结点。
                                  ⑸ 树中所有结点对应于高度为k的满二叉树中编号由1至n的那些结点。

      7.完全二叉树的性质:

           a.设若将一颗具有n个结点的完全二叉树按层次次序从1开始编号,则对编号为的结点有:
                        ① 若i≠1,则编号为 i 的结点的父结点的编号为
                             若2i<=n,则编号为 i 的结点的左孩子的编号为 2i,否则 i 无左孩子。
                             若2i+1<=n,则 i 结点的右孩子结点编号为2i+1,否则 i 无右孩子。

           b.具有n个结点的完全二叉树的高度是

                       注意:  当根结点的层数从1计时,树的高度为+1


 二.二叉树的顺序存储

            对于完全二叉树,结点的层次顺序反映了其结构,可按层次顺序给出一棵完全二叉树之结点的编号,事实上,这就是完全二叉树的顺序存储方法。

         优点:是完全二叉树最简单、最节省空间的存储方式,寻找也很方便。

         缺点:非完全二叉树时增加了用于存储虚结点的空间。

三.二叉树链接存储

      1.二叉树结点应包含三个域:数据域data、指针域left(称为左指针)和指针域right(称为右指针),其中左、右指针分别指向该结点的左、右子树的根结点. 

      2.各种算法实现:

Father(BinTreeNode*t,BinTreeNode*p)	//在以结点t为根结点的子树中搜索结点p的父结点
{
    BinTreeNode*q;
    if(t==NULL||p==NULL)return NULL;
    if(t->getleft()==p||t->getright()==p)return t;
    if((q=Father(t->getleft(),p))!=NULL)return q;
    else return Father(t->getright(),p);
}

Find(BinTreeNode*t,char item)	//在以结点t为根结点的子树中查找data域为item的结点
{
    BinTreeNode*p,*q;
    if(t==NULL)return NULL;
    if(t->getdata()==item)return t;
    if((p=Find(t->getleft(),item))!=NULL)return p;
    else return q=Find(t->getright(),item);
}

Del(BinTreeNode*t)//删除结点t及其左右子树
{
    if(t!=NULL){
        Del(t->getleft());
        Del(t->getright());
        delete t;
    }
}


  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值