美文网首页
数据结构与算法 --- 7(二叉树)

数据结构与算法 --- 7(二叉树)

作者: 空空_Jiminy | 来源:发表于2020-04-27 18:26 被阅读0次

    树的概念

    首先,让我们来了解一下树的一些基本概念。
    下图为一颗一般树。


    image.png

    树,有且只有一个根结点,哪怕只有一个结点,它其实也是一棵树。
    孩子:如图,B,C,D为A的孩子。
    度:结点所拥有子树的个数。(A结点的度就是3,B结点的度是2)。
    叶子:度为0的结点,称为叶子结点,或者终端结点。(K,J,F,G,M,I,J为叶子结点)
    双亲:上一个结点,在树中,双亲指的是一个结点。
    兄弟:同属于一个双亲结点下的结点。
    高度:距离最长的叶子节点的长度。
    深度:从根结点到当前结点的长度。
    层:从根节点开始计算,字面意思。

    二叉树概念

    除了根节点,每个结点最多只有2颗子树。这样的树,我们称为二叉树。

    特殊二叉树。

    1.斜树

    image.png
    image.png

    2.满二叉树

    每一个结点都有左结点和右结点,并且所有的叶子都在一个层级上面。这样的树,称为满二叉树。


    image.png

    3.完全二叉树

    具备有n个结点的二叉树。按照陈序编号陈列,这样的树,称为完全二叉树。


    image.png

    二叉树的顺序存储结构分析

    当二叉树为一颗完全二叉树时,可以使用一个数组进行存储。第一个元素就是根结点。


    image.png

    当二叉树不是完全二叉树时。


    image.png
    image.png

    空结点使用null来填充。很多空间是被浪费的。
    所以一般顺序存储只使用在完全二叉树上。

    遍历

    1.前序遍历

    image.png
    void PreOrderTraverse(BiTree T)
    {
        if(T==NULL)
            return;
        printf("%c",T->data);/* 显示结点数据,可以更改为其它对结点操作 */
        PreOrderTraverse(T->lchild); /* 再先序遍历左子树 */
        PreOrderTraverse(T->rchild); /* 最后先序遍历右子树 */
    }
    

    中序遍历

    image.png
    void InOrderTraverse(BiTree T)
    {
        if(T==NULL)
            return ;
        InOrderTraverse(T->lchild); /* 中序遍历左子树 */
        printf("%c",T->data);/* 显示结点数据,可以更改为其它对结点操作 */
        InOrderTraverse(T->rchild); /* 最后中序遍历右子树 */
    }
    

    后序遍历

    image.png
    void PostOrderTraverse(BiTree T)
    {
        if(T==NULL)
            return;
        PostOrderTraverse(T->lchild); /* 先后序遍历左子树  */
        PostOrderTraverse(T->rchild); /* 再后序遍历右子树  */
        printf("%c",T->data);/* 显示结点数据,可以更改为其它对结点操作 */
    }
    

    相关文章

      网友评论

          本文标题:数据结构与算法 --- 7(二叉树)

          本文链接:https://www.haomeiwen.com/subject/txulwhtx.html