1.1.定义:
二叉树是一棵每个结点的子结点数都不能超过两个的树。
1.2.性质
1.2.1.非空二叉树上第i层最多有2(i-1)个结点
1.2.2.深度为k的二叉树最多有2(k)-1个结点
1.2.3.在任意非空二叉树中,如果叶子结点的个数为n1,度为2的结点的个数为n2,则有:n1=n2+1
1.2.4.具有n个结点的完全二叉树深度为Llog2(n)L+1
1.3.实现
1.3.1.链式存储结构
typedef struct node
{
datatype data; //用来存储数据
dtruct node *lchild,rchild; //指向左右子结点
}*Tree;
1.3.2.二叉查找树的性质
对于树中的每一个结点X,它的左子树中的所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值。
二叉树的平均深度是O(logN)
1.3.3.主要操作
1.MKempt
Tree MKempt(Tree T)
{
if(T!=NULL)
{
MKempt(T->lchild);
MKempt(T->rchild);
free(T);
}
return NULL;
}
2.Find
此操作返回指向树T中具有关键字X的结点的指针,结点不存在则返回NULL。
此算法关键是要先判断树是否是空树否则就会一直在NULL指针里兜圈子。
Tree Find(datatype X,Tree T)
{
if(T==NULL)
return NULL;
if(X<T->data)
return Find(X,T->rchild);
else if(X>T->data)
return Find(X,T->lchild);
else
return T;
}
3.FindMin和FindMax
1.递归实现FindMin
Tree FindMin(Tree T)
{
if(T==NULL)
return NULL;
else if(T->left==NULL)
return T;
else
return FindMin(T->lchild);
}
2.非递归实现FindMax
Tree FindMin(Tree T)
{
if(T!=NULL)
while(T->rchild!=NULL)
T=T->lchild;
return T;
}
4.Insert
将X插入到树上,首先要遍历树,如果存在元素X,则不做处理,否则将X插入到遍历路径的最后一点上。
重复元的插入可以通过在结点记录上保留一个附加域以指示发生的频率来处理。
Tree Insert(datatype X,Tree T)
{
if(T==NULL)
{
T=malloc(sizeof(struct Tree));
if(T==NULL)
printf("out of space");
else
{
T->data=X;
T->lchild=T->rchild=NULL;
}
}
else if(X<T->data)
T->lchild=Insert(X,T->lchild);
else of(X>T->data)
T->rchild=Insert(X,T->rchild);
return T;
}