首先我们定义了一个结构体 node,结构体内有用来存放数据的data和指针 left 和 right 。
struct node { int data; struct node * rigth, *left; }; typedef struct node TreeNode;
定义完结构体后,先定义一个数组,用来存放结点内容,那我们就要先创建这么多的结点。
TreeNode *CreateTree(int *a) { int i; TreeNode * node[11] = {0}; //比循环多定义一个,防止不足。 for(i = 0; i < 10; i++) { node[i] = (TreeNode *) malloc (sizeof(TreeNode)); //为结点结构体分配空间 if(NULL == node[i]) { printf("malloc error!\n"); } node[i]->data = a[i]; //初始化 node[i]->rigth = NULL; node[i]->left = NULL; } for(i = 0;i < 10 / 2; i++) { node[i]->left = node[ 2 * i + 1]; //根据公式可以推算,公式详细请见下面 node[i]->rigth = node[ 2 * i + 2]; } return node[0]; }
main函数
int main() { int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; TreeNode *root; root = CreateTree(a); Pre0rder(root); printf("\n"); In0rder(root); printf("\n"); Post0rder(root); printf("\n"); return 0; }
!前序遍历!
int Pre0rder (TreeNode *T) { if(NULL == T) { return 1; } printf("%d ",T->data); Pre0rder(T->left); Pre0rder(T->rigth); return 0; }
!中序遍历!
int In0rder (TreeNode *T) { if(NULL == T) { return 1; } In0rder(T->left); printf("%d ",T->data); In0rder(T->rigth); return 0; }
!后续遍历!
int Post0rder (TreeNode *T) { if(NULL == T) { return 1; } Post0rder(T->left); Post0rder(T->rigth); printf("%d ",T->data); return 0; }
输出结果:
二叉树的性质:
- 在二叉树的第i层至多有2^(i-1)个结点
- 深度为k的二叉树至多有2^k-1个结点
- 对任何一颗二叉树T,如果其终端结点数为n,度为2的结点数为m,则n=m+1
- 具有n个结点的完全二叉树的深度为 log2(n)+1
- 如果对 1 棵有 n 个结点的二叉树的结点按层序编号,对任一结点 i:(1)如果 i = 1,则结点 i 是二叉树的根,无双亲,如果 i > 1 , 则其双亲是结点 ( i / 2)(2) 如果 2i > n, 则结点 i 无左孩子,否则, 其左孩子是 2i (3) 如果 2i + 1 > n, 则结点 i 无右孩子;否则其右孩子是结点 2i + 1