数据结构----二叉树

一、树和二叉树

  •  树

 1、树的定义:

        树(Tree)是由n(n>0)个结点组成的有限集;在任意一棵非空树中 :

        (1)有且仅有一个根结点

        (2)当n>1时 其余结点可以分为m(m>0)个互不相交的有限集T1,T2...Tm ;其中每个集合本身又是一棵树 并且称为根的子树SubTree

2、树的结点:包含一个数据元素以及若干个指向其子树的分支(保存数据与数据之间的关系)

3、结点的度(Degree):数据拥有的子树的数量

        (1)度为0的结点称之为叶子结点(leaf)或者终端结点

        (2)度不为0的结点称为分支结点或者非终端结点

4、 结点层次(level):从根开始定义,根为第一层,根的孩子为第二层...

        (1)树中结点最大层次称为树的高度或者深度

  • 二叉树

 1、二叉树(Binaru Tree):每个结点最多只有两棵子树的树,且其左右子树的次序不能随意颠倒

2、二叉树的五种形态:

        (1)NULL,空树,树不存在

        (2) 只有一个结点(根结点)

        (3)只有一个右子结点

        (4)只有一个左子结点

        (5)有左右结点

二、二叉树的性质

  1. 在二叉树的第i层上最多有 2^(i-1) 个结点(i>=1)
  2. 深度为k的二叉树最多有 2^k -1 个结点(k>=1)
  3. 叶子结点数 = 度为2的结点数 + 1
  4. 满二叉树:在不改变树的高度的情况下,无法再往这棵树里添加任何结点----一棵高度为k并且有2^k -1个结点的二叉树就叫做满二叉树 
  5. 完全二叉树:除去最后一层为一棵满二叉树;最后一层的左边结点是连续排列
  • 如果对一棵有n个结点的完全二叉树 从上到下 从左到右 给每个结点从1开始编号,则一个编号为 i 的结点有:
  • 他的父节点的编号是i/2 
  • 他的左子结点(如果有)的编号为2*i
  • 他的右子结点(如果有)的编号为2*i + 1 

 三、二叉树的实现

  • 顺序结构

 根据二叉树的性质,对所有结点进行编号,并且每一个结点的编号有如上性质;则 对于一棵完全二叉树可以直接用一个数组来保存它:

            typedef int TElemType;                         //树中结点的数据类型 
            #define MAX_TREE_SIZE 1024 ;         //树中最大结点的数量                                                          TElemType SeqBiTree[MAX_TREE_SIZE]; //真正保存结点的数据

  • 链式结构

        用一个数据域来保存结点的数据元素 
        用两个指针域 分别保存他的左子结点和右子结点

        typedef int TElemType; //树中结点保存的数据的 类型 

        //树的结点的类型
        typedef struct binode
        {
        TElemType data; //数据域 
        struct binode * lchild; //保存左子结点的指针 
        struct binode * rchild;//保存右子结点的指针
        }BINODE;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无知的猿始人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值