1>树:是由根结点和若干棵子树构成的树形结构,是n(n>=0)个结点的有限集,n>0时有且只有一个根结点,除根结点外,其余结点构成的互不相交的集合仍是一棵树
2> 空树:不含任何结点的树n=0
3>根结点:只有一个结点n=1
4> 普通树n>1: 多个结点
1>结点:树中的数据元素
2>结点的度:结点含有子树的个数
3> 根结点:没有双亲结点【前驱】的结点
4>分支结点(内部结点):是度不为0的结点
5>叶结点(终端结点):是度为0的结点
6>结点的层数:是从根结点到某结点所路径上的层数【根结点表示第一层】
7>树的深度(高度):是树中所有结点层数的最大值
8>树的度:各结点度的最大值
6> 结点之间的关系
1>父结点:是指当前结点的直接上级结点
2>孩子结点:是指当前结点的直接下级结点
3>兄弟结点:是由相同父结点的结点
4>祖先结点:是当前结点的直接及间接上级结点
5>子孙结点:是当前结点直接及间接下级结点
6>堂兄弟结点:是父结点在同一层的结点
1 二叉树的概念
二叉树:树的度小于等于2
1>二叉树是每个结点最多有左、右两棵子树且严格区分顺序的树形结构【二叉树不可以互换】
2>二叉树的左边:左子树是以当前结点的左孩子结点作为根节点的子树
3>二叉树的右边:右子树是以当前结点的右孩子结点作为根节点的子树
2 二叉树的特殊形态
1>空二叉树
2>只有一个根节点
3>只有左子树
4>只有右子树
5>既有左子树又有右子树
1>空二叉树:空二叉树是没有结点的二叉树
2>斜树:斜树是所有的结点都只有左子树或者都只有右子树的二叉树
2.1 左斜树:左斜树是所有的结点都只有左子树的斜树
2.2右斜树:右斜树是所有的结点都只有右子树的斜树
n个节点,斜树是最高的二叉树
3>满二叉树:满二叉树是最后一层是叶子结点,其余结点度是2的二叉树
(1)叶子结点只能出现在最下面一层
(2)非叶子结点的度数一定是2
(3)同样深度的二叉树中,满二叉树的结点的个数最多,叶子结点最多
完全二叉树:完全二叉树是在一棵满二叉树基础上自左向右连续增加叶子结点得到的二叉树
(1)只有最后两层有叶子结点
(2)除最后一层是一棵满二叉树
(3)最后一层的叶子结点集中在左边连续的位置
满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树
1.在非空二叉树的第i层上,至多有2^(i-1)个结点(i>=1)
[1,2^(i-1)]
2.在深度为K的二叉树上总结点最多有(2^k)-1个结点(k>=1)
深度为K的二叉树最少右k个节点,例如斜树
完全二叉树的节点[2^(k-1),(2^k)-1]
3.在任意一棵二叉树中,叶子结点的数目比度数为2的结点的数目多1
度为0:n0 度为1:n1 度为2:n2
n0=n2+1
总节点:n=n0+n1+n2
总结点数=树杈树+1
=2*n2+n1+1
4.
5.完全二叉树结点的编号方法是从上到下,从左到右根节点为1号结点设完全二叉树的结点数为n,某结点编号为I
若 i=1,则该结点是二叉树的根,无双亲,否则,其双亲结点是编号为 i/2的结点
若 2*i>n,则该结点无左孩子,否则,其左孩子结点是编号为 2i 的结点
若 2*i+1>n,则该结点无右孩子结点,否则,其右孩子结点是编号为2i+1 的结点
先序遍历:按照根左右的顺序
中序遍历:按照左根右的顺序
后序遍历:按照左右根的顺序
顺序存储
链式存储
节点创建
Btree create_node()
{
Btree p=(Btree)malloc(sizeof(struct Node));
if(NULL==p)
return NULL;
p->data='\0';
p->lchild=NULL;
p->rchild=NULL;
return p;
}
创建二叉树
Btree create_tree()
{
datatype element;
printf("please enter element:");
scanf(" %c",&element);
//假设#表示没有节点
if(element=='#')
return NULL;
//如果element不为#则需要创建节点存储element
Btree tree=create_node();
tree->data=element;
//递归创建左孩子
tree->lchild=create_tree();
//递归创建右孩子
tree->rchild=create_tree();
return tree;
}
先序
void first_output(Btree tree)
{
if(tree==NULL)
return;
printf("%c ",tree->data);
//根 //递归遍历左孩子
first_output(tree->lchild);
//递归遍历右孩子
first_output(tree->rchild);
}
中序
void mid_output(Btree tree)
{
if(tree==NULL)
return;
//递归左孩子
mid_output(tree->lchild);
printf("%c ",tree->data);//根
//递归右孩子
mid_output(tree->rchild);
}
后序
void last_output(Btree tree)
{
if(tree==NULL)
return; //递归左孩子
last_output(tree->lchild);
//递归右孩子
last_output(tree->rchild);
printf("%c ",tree->data);//根
}
void Count(Btree tree,int *n0,int *n1,int *n2) { if(tree==NULL) return; if(tree->lchild==NULL && tree->rchild==NULL) ++*n0; else if(tree->lchild!=NULL && tree->rchild!=NULL) ++*n2; else ++*n1; Count(tree->lchild,n0,n1,n2); Count(tree->rchild,n0,n1,n2); }
int length(Btree tree) { if(tree==NULL) return 0; //递归左边 int left=length(tree->lchild)+1; //递归右边 int right=length(tree->rchild)+1; return left>right?left:right; }