title: 自动生成完全二叉树
date: 2020-12-25 20:22:05
tags: 完全二叉树
categories: 数据结构
存储结构
二叉链表
, 如果要写的算法不是基于二叉链表
,那么肯定就偷不了懒啦
思路
基本思路就是直接生成一个数组长度length的节点
然后利用完全二叉树
的性质和数组的下标把它们串起来
要用到的完全二叉树
的性质
- 分支节点个数 = 总节点个数 整除 2 (在数学中就是 除以二 再向下取整)
- 序号为 i 的分支节点的左孩子的序号为 2 * i, 右孩子的序号为 2 * i + 1
- 最后一个分支节点的序号为 总结点个数 整除 2
- 第一个叶子节点的序号为 总结点个数 整除 2 再 加一
代码附上
// 生成完全二叉树
// 完全二叉树的存储结构为二叉链表
#include <stdlib.h>
typedef struct treeNode
{
int data;
struct treeNode *left, *right;
}TreeNode, *Tree;
Tree initTree(int nodeCounts)
{
if (nodeCounts < 1)
return NULL;
// 这个操作仅仅是让p指向申请的那块空间的首地址,p不是树的头指针
Tree p = (Tree)malloc(sizeof(TreeNode) * (nodeCounts + 1));
for (int i = 1; i <= nodeCounts; i++)
p[i].data = i;
for (int i = 1; i <= nodeCounts / 2; i++)
{
p[i].left = p + 2 * i;
p[i].right = p + 2 * i + 1;
}
for (int i = nodeCounts / 2 + 1; i <= nodeCounts; i++)
{
p[i].left = NULL;
p[i].right = NULL;
}
return p + 1;
}