二叉树的性质与存储结构

    二叉树是一种特殊的树,其主要特点便是每个结点至多拥有两棵子树(每个结点的度不超过2),同时,由于存储字符的简单应用以及访问顺序的要求,二叉树的子树有着左右子树之分,同时左右子树的顺序也不能颠倒。二叉树中所谓的“树”仅仅只是一种数据结构的载体。每一个结点可以表示成二叉链表的形式。这一点在本文的第二部分会谈到。

  1.二叉树的性质 

  性质1:第i层上至多有2^{i-1}个结点(i从1开始增加)

  性质2:深度为 l 的二叉树至多有2^{l}-1个结点

  二叉树的深度为l,每一层上的结点数目为2^{i-1},由等比数列的求和公式可以得出结果:

                                                                     \sum_{i=1}^{i=l}2^{i-1}=2^{l}-1  

  性质3:对于任何一棵二叉树,若叶子结点数为N0,度为2的结点数为N2,则N0=N2+1

由树的基本定义与结构中可以了解得叶子结点数与度的概念,假设二叉树中的结点总数为N,同时度为1的结点数为N1,有以下等式:

                                                                  N=N0+N1+N2

根据度的概念可以得知,结点向下延伸的直线连接至另一个结点,向下关联的结点数目就是结点的度,而每一个结点仅仅只有一条由上向下连接的直线。所以,所有的结点数目之和等于连接的直线数加1(1代表顶端的根结点),度为2的点向下发出的直线数目为2,度为1的结点发出的数目为1:

                                                                 N=2*N2+N1+1

综合以上两式,得出结论为:                       N0=N2+1

注:完全二叉树与满二叉树的区别,满二叉树是指深度为l,并且具有2^{l}-1个结点的二叉树,完全二叉树是指在深度为l,  结点数为n的二叉树中,当且仅当每一个结点与深度为l的满二叉树中编号为1至n的结点一一对应时,该二叉树称作完全二叉树(即二叉树若存在第l层,其上l-1层必定是满二叉树)。两种二叉树的示意图如下:

满二叉树
完全二叉树

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

                                                                     \left \lfloor log _{2}n\right \rfloor+1

假设完全二叉树的深度为k,又因为完全二叉树的性质,导致其节点数目n处于2^{k-1}-12^{k}-1之间,得出k-1\leqslant log_{2} n< k,由于k是整数的缘故,所以        

                                                                       k=\left \lfloor log_{2} n\right \rfloor+1

性质5: 若对一棵有n个结点的完全二叉树结点按每一层从左到右的顺序来编号,对于任何一个编号为i的结点均有以下结论:

(1) i = 1,则 i 是二叉树的根,无双亲。若i >1,则双亲是编号为\left \lfloor i/2 \right \rfloor 的结点

(2)若 2*i> n,结点i无左孩子,否则,其左孩子结点的编号为2*i 

(3)若2*i+1>n,则结点i 无右孩子,否则其右孩子是节点2*i+1

以图“完全二叉树”为例,编号为3的结点无右孩子,编号为4、5、6的结点无左孩子

2.二叉树的链式存储结构

  二叉树的结构相比普通的链表结点较为复杂些,一种形式的二叉树结点结构包括一个数据域以及两个指针域(指针域为左右指针域),有时候更为复杂的结构还包括了一个parent指针用于指向二叉树的双亲结点,存储结构的主要示意图以及代码如下:

普通二叉结点示意图
带指向双亲结点指针的树结点
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
typedef struct BiTnode
{
    int data;
    struct BiTnode *left,*right;
}BiTNode,*BiTree;

猜你喜欢

转载自blog.csdn.net/qq_38846633/article/details/81806302
今日推荐