树:一个或多个结点的有限集合
重要概念:
结点:树中的一个独立单元。(一个圈就是一个结点)
结点的度:结点拥有的子树个数称为结点的度。(A有三个子树,度为3,B有2个)
树的度:树内各结点度的最大值。(整个树度为3)
叶子:度为0的结点或终端结点。(KLFGMIJ)
非终端结点:度不为0的结点。
双亲和孩子:结点的子树的根称为该结点的孩子,相应地,该结点称为孩子的双亲。(A的孩子是BCD,A是BCD的双亲)
层次:结点的层次从根开始定义,根为第一层,根的孩子为第二层,以此类推。
基本性质
1.树中所有结点数(一共几个圈)等于所有结点的度数之和+1。
2.对于度为m的树,第i层上最多有m的i-1次方个结点。
二叉树:n个结点所构成的集合,为空树(n=0)或者非空树(n>0)
二叉树子树有左右之分,次序不能颠倒
二叉树每个结点最多只有两个子树
二叉树的性质 1.二叉树的第i层最多有2的i-1次方个结点
2.深度为K的二叉树最多有2的K-1次方个结点
3.对于任何非空的二叉树T,如果叶子结点的个数为n0,而度为2的结点数为n2,则 n0=n2+1
特殊二叉树
满二叉树:深度为k且含有2的k-1次方个结点的二叉树
(1)所有的叶子结点只能出现在最后一层; (2)对于同样深度的二叉树,满二叉树的结点个数最多,叶子结点的数量也是最多的; (3)如果对满二叉树进行编号,根结点从1开始,从上到下从左到右,对于编号为i的结点,若存在左孩子,则左孩子的编号为2i,右孩子为2i+1。
完全二叉树:没有左子树,不能有右子树,上层没铺满,不能有下一层
(1)叶子结点只可能在层次最大的两层上出现;(最后一层或倒数第二层)(2)对任一结点,若其右分支下的子孙的最大层次为i,则其左分支下的子孙的最大层次必为i或i+1。
二叉树的存储结构——链式存储
typedef char ElemType;
typedef struct TreeNode
{
ElemType data;
struct TreeNode *lchild;
struct TreeNode *rchild;
} TreeNode;
typedef TreeNode* BiTree;
二叉树的遍历——前序遍历
void preOrder(BiTree T)
{
if (T == NULL)
{
return;
}
printf("%c ", T->data);
preOrder(T->lchild);
preOrder(T->rchild);
}
二叉树的遍历——中序遍历
void inOrder(BiTree T)
{
if (T == NULL)
{
return;
}
inOrder(T->lchild);
printf("%c ", T->data);
inOrder(T->rchild);
}
二叉树的遍历——后序遍历
void postOrder(BiTree T)
{
if (T == NULL)
{
return;
}
postOrder(T->lchild);
postOrder(T->rchild);
printf("%c ", T->data);
}