二叉树的定义
二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根结点和两颗互不相交的,分别称为根结点的左子树和右子树的二叉树组成。
二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根结点和两颗互不相交的,分别称为根结点的左子树和右子树的二叉树组成。
二叉树的特点有:
每个结点最多有两颗子树,所以二叉树中不存在度大于2的结点。
左子树和右子树是有顺序的,次序不能任意颠倒。
即使树中某结点只有一颗子树,也要区分是右子树还是左子树。
每个结点最多有两颗子树,所以二叉树中不存在度大于2的结点。
左子树和右子树是有顺序的,次序不能任意颠倒。
即使树中某结点只有一颗子树,也要区分是右子树还是左子树。
特殊二叉树
1、斜树
所有的结点都只有左子树的二叉树叫做左斜树,所有的结点都只有右子树的二叉树叫做右斜树。这两者统称为斜树。
2、满二叉树
在一棵二叉树中,如果所有的分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。
3、完全二叉树
对一颗具有n各结点的二叉树按层序编号,如果编号为i的结点与同样深度的满二叉树编号为i的结点在二叉树中位置完全相同,则这颗二叉树称为完全二叉树。
1、斜树
所有的结点都只有左子树的二叉树叫做左斜树,所有的结点都只有右子树的二叉树叫做右斜树。这两者统称为斜树。
2、满二叉树
在一棵二叉树中,如果所有的分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。
3、完全二叉树
对一颗具有n各结点的二叉树按层序编号,如果编号为i的结点与同样深度的满二叉树编号为i的结点在二叉树中位置完全相同,则这颗二叉树称为完全二叉树。
二叉树的性质:
1)在二叉树的第i层上至多有(2^(i-1))个结点
2)深度为k的二叉树至多有(2^k - 1)个结点
3)对任意一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0 = n2 + 1;
4)具有n个结点的完全二叉树的深度为((log2n)+1)
1)在二叉树的第i层上至多有(2^(i-1))个结点
2)深度为k的二叉树至多有(2^k - 1)个结点
3)对任意一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0 = n2 + 1;
4)具有n个结点的完全二叉树的深度为((log2n)+1)
二叉树的存储结构
二叉树顺序存储结构:一般只适用于完全二叉树
顺序存储结构就是用一维数组二叉树中的结点,并且节点的储存位置和数组的下标要体现结点之间的逻辑关系。
顺序存储结构就是用一维数组二叉树中的结点,并且节点的储存位置和数组的下标要体现结点之间的逻辑关系。
二叉链表:
二叉树每个结点最多有两个孩子,所以为它设计一个数据域和两个指针域,我们成这样的链表为二叉链表
结点代码结构:
typedef struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
}
二叉树每个结点最多有两个孩子,所以为它设计一个数据域和两个指针域,我们成这样的链表为二叉链表
结点代码结构:
typedef struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
}
二叉树的遍历方法
前序遍历:
中序遍历:
后序遍历:
层序遍历:
中序遍历:
后序遍历:
层序遍历:
线索二叉树: