• 二叉树知识总结(一)


    树的定义:

    • 树是一种数据结构,它是由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);
      }
  • 相关阅读:
    建站随手记:about server stack
    【个人申明】主要发表平台迁至简书和公众号
    每日一问:Android 消息机制,我有必要再讲一次!
    每日一问:View.getContext() 的返回一定是 Activity 么?
    每日一问:Android 滑动冲突,你们都是怎样处理的
    每日一问:谈谈 SharedPreferences 的 apply() 和 commit()
    每日一问:浅谈 onAttachedToWindow 和 onDetachedFromWindow
    每日一问:到底为什么属性动画后 View 在新位置还能响应事件
    百万级日活 App 的屏幕录制功能是如何实现的
    每日一问:不一样的角度吐槽下 DataBinding
  • 原文地址:https://www.cnblogs.com/Lan-ZC0803/p/9493144.html
Copyright © 2020-2023  润新知