二叉树规律:
假设根节点的高度为0
- 二叉树是每个节点至多只有两个节点的树
- 深度为i所在的层至多有 2^i个节点
- 高度为k的二叉树至多有2^(k+1)-1个节点
- n0表示度为0的节点, n2表示度为2的节点,存在n0 = n2 + 1
对所有树有:节点个数 = 边数+1
完全二叉树规律
- 节点数为N的完全二叉树,其高度为 (向下取整),也就是说该树一共有logn + 1 层。
- 对于完全二叉树,若从上至下、从左至右编号,则编号为i的节点,其左孩子节点编号为2i,右孩子节点编号为2i+1,父亲节点为i/2;
相关函数实现
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <iostream>
using namespace std;
typedef char BTDataType;
typedef struct BinaryTreeNode
{
BTDataType _data;
struct BinaryTreeNode* _left;
struct BinaryTreeNode* _right;
}BTNode;
// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
BTNode* BinaryTreeCreate(BTDataType* a, int n, int* pi)
{
if (a[*pi] != '#') {
BTNode* cur = (BTNode*)malloc(sizeof(BTNode));
cur->_data = a[(*pi)++];
cur->_left = BinaryTreeCreate(a, n, pi);
(*pi)++;
cur->_right = BinaryTreeCreate(a, n, pi);
return cur;
}
return NULL;
}
// 二叉树销毁
void BinaryTreeDestory(BTNode** root)
{
if (*root) {
BinaryTreeDestory(&(*root)->_left);
BinaryTreeDestory(&(*root)->_right);
free(*root);
*root = NULL