数据结构一直就很差,一直搞不清那些树的节点和数组是怎么一一对应起来的,写个博客自己整理下思路。
二叉树的定义
二叉树是一种非常使用的非线性结构,具有以下两个特点:
- 非空二叉树只有一个根结点
- 每一个节点最多有两棵子树,分别称为该节点的左子树和右子树
二叉树的性质
性质1:在二叉树的第k层,最多有2k-1(k>=1)个结点
性质2:深度为m的二叉树最多有2m-1个结点
性质3:在任意一颗二叉树中,读书为0的结点(即就是叶子结点)总比度为2的结点多一个
性质4:具有n个结点的二叉树,其深度至少为[log2n]+1,其中[log2n]表示取log2n的整数部分
有序数组变成二叉树步骤:
如将有序数组[1,2,3,4,5,6,7,8,9]变成一棵二叉树
// - 首先定义每一个节点,每个节点包括自身值,左节点和右节点
struct Node
{
int data;
Node* _left;
Node* _right;
}node;
//- 采用递归的方法创建二叉树
typedef Node* bitree;
void BuildTree(bitree &T, int*a, int begin, int end)
{
if (begin > end)
return;
int mid = (begin + end) / 2;
if (T == NULL) //为当前树的根结点申请空间
{
T = (Node*)malloc(sizeof(Node));
T->data = a[mid];
T->_left = NULL;
T->_right = NULL;
}
BuildTree(T->_left, a, begin, mid - 1);
BuildTree(T->_right, a, mid+1, end);
}