二叉树知识总结(一)

树的定义:

  • 树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合
    • (1)每个结点有零个或多个子结点
    • (2)没有父节点的结点称为根节点
    • (3)每一个非根结点有且只有一个父节点
    • (4)除了根结点外,每个子结点可以分为多个不相交的子树。

用到的术语:

 

  • 结点的度:结点拥有的子树的数目
  • 叶子结点:度为0的结点
  • 分支结点:度不为0的结点
  • 树的度:树中结点的最大的度
  • 层次:根结点的层次为1,其余结点的层次等于该结点的双亲结点的层次加1
  • 树的高度:树中结点的最大层次
  • 森林:0个或多个不相交的树组成。对森林加上一个根,森林即成为树;删去根,树即成为森林

 

二叉树:

  • 定义:
    • 二叉树是每个结点最多有两个子树的树结构。它有五种基本形态:二叉树可以是空集;根可以有空的左子树或右子树;或者左、右子树皆为空。
  • 性质:
    • 性质1:二叉树第i层上的结点数目最多为2i-1(i>=1)
    • 性质2:深度为k的二叉树至多有2k-1个结点(k>=1)
    • 性质3:包含n个结点的二叉树的高度至少为(log2n)+1
    • 性质4:在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1

满二叉树,完全二叉树:

  • 满二叉树,度为0和2的二叉树;
  • 完全二叉树,只有最下面两层节点,度小于2的二叉树;
  • 完全二叉树,若设二叉树的高度为h,除第h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。
  • 完全二叉树,度为1的节点要么为0,要么为1。

一些性质:

  • 如果一棵完全二叉树的结点总数为n,那么叶子结点等于n/2(当n为偶数时)或者(n+1)/2(当n为奇数时)
  • 定义n为节点总个数,n0是度为0的个数,n1是度为1的个数,n2是度为2个数。
    • 则有n=n0*0+n1*1+n2*2+1 ; n = n0+n1+n2
    • n0=n2+1。

树表示:多叉树转成二叉树

  • 一个节点的结构:left(指向孩子),data,right(指向兄弟);左孩子右兄弟

树的存储:

  • 数组中:还原困难;
  • 链表中:指针域的个数不定;
  • 解决方案,把无序树转换成二叉树,然后两个指针域,左孩子右兄弟。
  • 二叉链表示法:一个data域,两个指针域,左孩子右兄弟
  • 三叉链表表示法:可以由孩子找到父亲
  • 双亲表示法:可以存储不规则的树

数的遍历:      树:a(b(d,e),c(f,g))

  • 先序:根,左子树,右子树   顺序:a,b,d,e,c,f,g
  • 中序:左子树,根,右子树   顺序:d,b,e,a,f,c,g
  • 后序:左子树,右子树,根   顺序:d,e,b,f,g,c,a 
    //先序遍历
    void xianxuBL(BiTNode * root)
    {
        //递归结束的条件
        if (root == NULL)
        {
            //空节点结束
            return;
        }
        
        //访问根节点
        printf("%c", root->data);
        //遍历左子树
        xianxuBL(root->lChild);
        //遍历右子树
        xianxuBL(root->rChild);
    }
    //中序遍历
    void zhongxuBL(BiTNode * root)
    {
        //递归结束的条件
        if (root == NULL)
        {
            //空节点结束
            return;
        }
    
        //遍历左子树
        zhongxuBL(root->lChild);
        
        //访问根节点
        printf("%c", root->data);
        
        //遍历右子树
        zhongxuBL(root->rChild);
    }
    //后序遍历
    void houxuBL(BiTNode * root)
    {
        //递归结束的条件
        if (root == NULL)
        {
            //空节点结束
            return;
        }
    
        //遍历左子树
        houxuBL(root->lChild);
    
        //遍历右子树
        houxuBL(root->rChild);
    
        //访问根节点
        printf("%c", root->data);
    }

     

 

posted @ 2018-08-17 14:34  晓生寒  阅读(646)  评论(0编辑  收藏  举报