除最后一层无任何子节点外,每一层上的所有结点都有两个子结点二叉树。
国内教程定义:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树.
如果一棵二叉树的结点要么是叶子结点,要么它有两个孩子结点,这样的树就是满二叉树。
用链表从上往下, 从左往右依次标记为1 ,2 , 3, 4, 5,…
考虑用二叉查询法的方法不行, 因为节点左侧小于节点, 右侧大于节点, 但仔细观察, 节点左侧是节点的2倍, 节点右侧是节点的2倍+ 1
T Insert(T node)
{
if (node->L != NULL)
node->L = Insert(node->L);
if (node->R != NULL)
node->R = Insert(node->R);
if (node->L == NULL)
{
Creat(node->L);
node->L->num = node->num * 2;
}
if (node->R == NULL)
{
Creat(node->R);
node->R->num = node->num * 2 + 1;
}
return node;
}
这样即可
源代码
/*
所有结点从上到下从左到右
编号为1, 2, 3,…, 2D-1。
*/
#include <stdio.h>
#include <stdlib.h>
struct Node;
typedef struct Node *T;
struct Node
{
int num;
T L;
T R;
};
void Creat(T &node)
{
if (node == NULL)
{
node = (T)malloc(sizeof(struct Node));
if (node == NULL)
exit(0);
node->L = node->R = NULL;
}
}
T Insert(T node)
{
if (node->L != NULL)
node->L = Insert(node->L);
if (node->R != NULL)
node->R = Insert(node->R);
if (node->L == NULL)
{
Creat(node->L);
node->L->num = node->num * 2;
}
if (node->R == NULL)
{
Creat(node->R);
node->R->num = node->num * 2 + 1;
}
return node;
}
void P(T node)
{
if (node != NULL)
{
printf("%d ", node->num);
P(node->L);
P(node->R);
}
}
int main()
{
T node = NULL;
Creat(node);
node->num = 1;
int m;
scanf("%d", &m);
for (int i = 1; i < m; i++)
node = Insert(node);
P(node);
system("pause");
return 0;
}