前言
树(Tree)是n(n≥0)个节点的有限集合T,它满足两个条件 :
有且仅有一个特定的称为根(Root)的节点;
其余的节点可以分为m(m≥0)个互不相交的有限集合T1、T2、……、Tm,其中每一个集合又是一棵树,并称为其根的子树
表示方法 :树形表示法、目录表示法。
一、二叉树是什么?
简单地理解,满足以下两个条件的树就是二叉树:
- 本身是有序树;
- 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2
二叉树具有以下几个性质: - 二叉树中,第 i 层最多有 2i-1 个结点。
- 如果二叉树的深度为 K,那么此二叉树最多有 2K-1 个结点。
- 二叉树中,终端结点数(叶子结点数)为 n0,度为 2 的结点数为 n2,则 n0=n2+1。
二、C语言实现
1.创建树模版
代码如下(示例):
typedef char TDataType;
// create binary tree node template
typedef struct BiTNode{
TDataType data; // data region, son`s apearance
struct BiTNode *lchild, *rchild; // tow sons
}BiTNode, *BiTree;
2.村的三种遍历方法(先序,中序,后序)
代码如下(示例):
// create binary tree
BiTree CreateTree(){
TDataType data;
BiTree r;
scanf("%c", &data);
if(data == '#'){
return NULL;
}
if((r = (BiTree)malloc(sizeof(BiTNode))) == NULL){
printf("malloc space failed!!\n");
return NULL;
}
// node create OK!!
r->data = data;
r->lchild = CreateTree(); // recursive create == r->lchild = r->data;!!!
r->rchild = CreateTree(); // too lastrow
return r;
}
// three kinds of traversal
void Preorder(BiTree r){
if(!r) return;
printf("%c ", r->data);
Preorder(r->lchild);
Preorder(r->rchild);
}
void Inorder(BiTree r){
if(!r) return;
Inorder(r->lchild);
printf("%c ", r->data);
Inorder(r->rchild);
}
void Postorder(BiTree r){
if(!r) return;
Postorder(r->lchild);
Postorder(r->rchild);
printf("%c ", r->data);
}
总结
满二叉树除了满足普通二叉树的性质,还具有以下性质:
- 满二叉树中第 i 层的节点数为 2n-1 个。
- 深度为 k 的满二叉树必有 2k-1 个节点 ,叶子数为 2k-1。
- 满二叉树中不存在度为 1 的节点,每一个分支点中都两棵深度相同的子树,且叶子节点都在最底层。
- 具有 n 个节点的满二叉树的深度为 log2(n+1)。
***对于任意一个完全二叉树来说,***如果将含有的结点按照层次从左到右依次标号,对于任意一个结点 i ,完全二叉树还有以下几个结论成立:
- 当 i>1 时,父亲结点为结点 [i/2] 。(i=1 时,表示的是根结点,无父亲结点)
- 如果 2i>n(总结点的个数) ,则结点 i 肯定没有左孩子(为叶子结点);否则其左孩子是结点 2i 。
- 如果 2i+1>n ,则结点 i 肯定没有右孩子;否则右孩子是结点 2i+1 。