二叉树的性质和存储结构

定义:

二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树

 

性质1:在二叉树的第i层上最多有2^i-1个结点(i>=1)

这个不用多说,满二叉树,第一层1个结点,第二层2个结点,第三层4个

性质2:深度为K的二叉树最多有(2^k)-1个结点(k>=1),最少K个结点

这个就是1+2+4+..,一个等比求和,求出来的结果就是(2^k)-1

性质3:对任何一个二叉树T,如果其叶子数为n0,度为2的结点数为n2,则n0 = n2 + 1

证明:总边数B=结点数n - 1

        度为2的结点产生2条边,度为1的结点产生一条边,所以有:

        总边数B = n2 x 2 + n1 x 1,因为两个总边数相等,所以有:n = n2 x 2 + n1 x 1 + 1

    又因为总结点数n = n2 + n1 + n0,所以有n2 x 2 + n1 x 1 + 1 = n2 + n1 + n0,可以得出n0 = n2 + 1

性质4:具有n个结点的完全二叉树的深度为

以2为底,值为n的对数,取底,然后再+1.假设一个完全二叉树有9个结点,那么可以计算出他的深度为:2为底9的对数为3.08,取底为3,再加上1,等于4

性质5:一个完全二叉树,对从1开始对每个结点进行编号(按从上到下,从左至右的规则)

如果i = 1,说明是根结点.如果i > 1,那么其双亲是结点 i/2 取底

结点编号为i,那么他的左孩子结点为2i,右孩子结点为2i+1

二,关于二叉树的存储,可以顺序存储和链式存储

1:顺序存储

顺序存储就是把二叉树,按满树的形式,对每个结点进行编号,然后可以把编号当作数组的下标,对数组进行赋值,查找等操作.

 那么这个二叉树就可以用数组的形式来表示:BT[0, a, b, c, d, e, f, g........o]

如果这个二叉树不是满树,那没有数据的结点就为空或者0.比如:

 

 那么我们这个二叉树的表示就为:BT[a, b, c, 0, d, e, 0],这样做,我们就可以根据数据内存还原出这个二叉树,也方便我们以后的操作.但是,由于除了满树和完全树,别的一些树空间浪费比较多,失去了数组存储的优势,所以就有了链式存储

二:链式存储

1:二叉链

 创建一个结构体,包含数据域data,两个指针域lchild,rchild,分别指向自己的孩子

typedef struct BinaryTree

{        int data;

        struct BinaryTree* lchild;

        struct BinaryTree* rchild;

}BT;

 没错,这就是一个自己包含自己的递归型数据,有点像广义表了.如果实际操作当中,要经常对双亲结点进行访,那么就有了下面的三叉链.

2:三叉链

 

 创建一个结构体,包含数据域data,三个指针域lchild,rchild, parent,分别指向自己的孩子和双亲

typedef struct BinaryTree

{        int data;

        struct BinaryTree* lchild;

        struct BinaryTree* rchild;

        struct BinaryTree* parent;

}BT;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值