一.基本概念:
二叉树的几个重要性质:
1.对于任意的二叉树,叶子结点数=度为2的节点数+1 即N0=N2+1;
2.从1开始的二叉树,编号为n的结点的左孩子编号为2n,右孩子编号为2n+1,父结点的编号为n/2;
3.对于任意树 总结点n=分叉数(度之和)+1;
4.哈夫曼树中不存在度为1的结点;
5.普通树转换成二叉树时,左孩子指向最左边的孩子,又孩子指向其兄弟;
6.深度为n的完全二叉树,最少有2的n-1次方的结点,最多有2的n次方减1个结点;
二:二叉树的遍历
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
struct BiTree{ //二叉树的结构 由一个数据域和两个指针域组成
char data;
struct BiTree *pl;
struct BiTree *pr;
};
struct BiTree * create();
void prelist(struct BiTree * P);
void lastlist(struct BiTree * P);
void midlist(struct BiTree * P);
int main(){
struct BiTree *PT=create(); //创建一个二叉树,返回给一个二叉树的根节点即可 完全确定一个二叉树
printf("先序遍历的顺序为:\n");
prelist(PT); //先序遍历
printf("后序遍历的顺序为:\n");
lastlist(PT);//后续遍历
printf("中序遍历的顺序为:\n");
midlist(PT);//中序遍历
return 0;
}
struct BiTree * create(){
struct BiTree *PA=(struct BiTree *)malloc(sizeof(struct BiTree)); //创建5个节点
struct BiTree *PB=(struct BiTree *)malloc(sizeof(struct BiTree));
struct BiTree *PC=(struct BiTree *)malloc(sizeof(struct BiTree));
struct BiTree *PD=(struct BiTree *)malloc(sizeof(struct BiTree));
struct BiTree *PE=(struct BiTree *)malloc(sizeof(struct BiTree));
PA->data='A'; //向五个节点的数据域存值
PB->data='B';
PC->data='C';
PD->data='D';
PE->data='E';
PA->pl=PB; //确定树的结构
PA->pr=PC;
PB->pl=PB->pr=NULL;
PC->pl=PD;
PC->pr=NULL;
PD->pl=NULL;
PD->pr=PE;
PE->pl=PE->pr=NULL;
return PA; //返回根节点
}
void prelist(struct BiTree * P){
if(P!=NULL) //注意 一定要加判断条件语句
{
printf("%c\n",P->data); //先序排列 先输出根节点
if(P->pl!=NULL)
{
prelist(P->pl); //递归调用
}
if(P->pr!=NULL)
{
prelist(P->pr);
}
}
}
void lastlist(struct BiTree * P){
if(P!=NULL)
{
if(P->pl!=NULL)
{
lastlist(P->pl);
}
if(P->pr!=NULL)
{
lastlist(P->pr);
}
printf("%c\n",P->data); //后序排列后输出根节点的值
}
}
void midlist(struct BiTree * P){
if(P!=NULL)
{
if(P->pl!=NULL)
{
midlist(P->pl);
}
printf("%c\n",P->data); //中序排列中间输出根节点的值
if(P->pr!=NULL)
{
midlist(P->pr);
}
}
}
三 运行结果: