二叉树的五条性质:
1.在二叉树的第i层上至多有2^(i-1)个节点(i>=1)
2.深度为k的二叉树至多有2^k-1个节点(k>=1)
3.对任何一个二叉树T,如果其终端节点数为n0,度为2的节点数为n2,则n0=n2+1.
证:总结点数n=n0+n1+n2
设分支总数B,n=B+1
B=n1+n2;两式加减即证出。
补充个定义:节点拥有的子树数称为节点的度。
树的度是树内各节点度的最大值。
4.具有n个节点的完全二叉树的深度为floor(log(2)n)+1
5.如果对一颗有n个节点的完全二叉树(其深度为floor(log(2)n)+1)的节点按层序号(从第一层到floor(log(2)n)+1层,每层从左到右),则对任意节点(1<=i<=n)
(1),如果i=1,则节点i是二叉树的根,无双亲,如果i>1,则其双亲PARENT(i)是floor(i/2);
(2)如果2*i>n,则节点i无左孩子(节点i为叶子节点),否则其左孩子LCHILD(i)是节点2*i;
(3)如果2*i+1>n,则节点i无右孩子,否则其右孩子RCHILD(i)是节点2*i+1.
#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
//二叉树的存储结构
///----------二叉树的顺序存储表示-------------------
#define MAX_TREE_SIZE 100 //二叉树的最大节点树
typedef int SqBiTree[MAX_TREE_SIZE]; //0号单元存储根节点
SqBiTree bt;
//
///---------------存储结构劲适用于完全二叉树---------------------
//
int main()
{
int d;
printf("输入完全二叉树深度d:");
scanf("%d",&d);
printf("按层的顺序输入完全二叉树\n");
for(int i=0;i< floor(pow(2,d)+0.5 )-1 ;i++)
scanf("%d",bt+i);
printf("按层的顺序遍历该完全二叉树为:\n");
int j=0;
for(int i=0;i< floor(pow(2,d)+0.5 )-1 ;i++){
if(i == floor(pow(2,j)+0.5 ) ) { puts(""); j++; }
printf("%d\t",bt[i]);
}
return 0;
}