树与二叉树

95 阅读2分钟

:一个或多个结点的有限集合

重要概念:

67ea37962580d9776dd74de14739ff5f.jpg

结点:树中的一个独立单元。(一个圈就是一个结点)

结点的度:结点拥有的子树个数称为结点的度。(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);
}