二叉树、树

207 阅读2分钟

二叉树

  • 每个节点至多只有两棵子树_(不存在度大于2的结点)_,有左右子树的分别,次序不可以颠倒

  • 完全二叉树

    • 将节点数进行编号,每一个编号的结点所在位置与满二叉树上相同
  • 满二叉树

    • 每层节点都是满的,最后一层是叶子节点
  • 二叉树的性质

    • ii 层上至多有 2i1(i>0)2^{i-1}(i>0) 个结点

    • 深度为 kk 的二叉树至多有 2k1(k>0)2^k -1(k>0)个结点

      • i=1k(i层上最大的节点数)=i=1k2i1=2k1\sum_{i=1}^{k}(第i层上最大的节点数) = \sum_{i=1}^k 2^{i-1} = 2^k -1
    • 叶子节点 (终端结点) 数为 n0n_0,度为 22 的节点数 n2n_2,则 n0=n2+1n_0=n_2+1

      • 假设度为1的节点数为 n1n_1,所有节点数为 NN,所有分支数目BB

      • N=n0+n1+n2N=B1B=n1+n2n0=n2+1N = n_0 + n_1 + n2\\ N = B -1\\ B = n_1 + n_2\\ n_0=n_2+1
    • 具有 nn 个结点的完全二叉树的深度为 logn+1\lfloor \log_n \rfloor + 1

    • 如果对一颗树有 nn 个结点的完全二叉树 (深度为 logn+1\lfloor \log_n \rfloor + 1) 的结点按连续层序编号,则对任一结点 ii (1in1\leq i \leq n) ,有:

      • i=1i =1 ,ii 为根结点,否则,双亲结点的编号为 i/2i/2
      • 2i>n2i > n , 则编号为 ii 的结点没有左孩子,否则左孩子为 2i2i
      • 2i+1>n2i+1 > n , 则编号为 ii 的结点没有右孩子,否则右孩子为 2i+12i + 1
  • 二叉树的存储结构

    • 顺序存储
    • 链式存储
      • 二叉链表
      • 三叉链表 (多一个指针指向父节点)
  • 二叉树的遍历

    • 先序遍历 DLRDLR

      void preOrder(biTree bt){
      	if( bt != null ){
      		visit(bt)
      		preOrder(bt.lchild)
      		preOrder(bt.rchild)
      	}
      }
      
    • 中序遍历 LDRLDR

      void inOrder(biTree bt){
      	if( bt != null ){
      		inOrder(bt.lchild)
      		visit(bt)
      		inOrder(bt.rchild)
      	}
      }
      
    • 后序遍历 LRDLRD

      void postOrder(biTree bt){
      	if( bt != null ){
      		postOrder(bt.lchild)
      		postOrder(bt.rchild)
      		visit(bt)
      	}
      }
      
  • 二叉树的非递归遍历

  • 栈_(中序遍历)_

  • 队列_(层序遍历)_

  • 根据先序遍历和中序遍历还原二叉树

    • 找出根结点,划分左右子树
    • 在左右子树中找出根结点,再划分左右子树

线索二叉树

  • 增加两个标志位 ltagltagltagltag

    ltag={1lchild指示结点的左孩子0lchild指示结点的前驱rtag={1rchild指示结点的右孩子0rchild指示结点的后继ltag = \begin {cases} 1 &\text{lchild指示结点的左孩子} \\0 &\text{lchild指示结点的前驱} \end{cases}\\ rtag = \begin {cases} 1 &\text{rchild指示结点的右孩子} \\0 &\text{rchild指示结点的后继} \end{cases}
  • 如果有左孩子,则 lchildlchild 存储值,否则存储前驱 (前驱和后继按照遍历的顺序)

  • 如果有右孩子,则 rchildrchild 存储值,否则存储后继

  • 前驱:该结点左子树右指针域为1

  • 后继:该结点右子树左指针域为1

  • 双亲表示法

    本节点的值结点双亲在数组中的位置
    datadataparentparent
  • 孩子表示法:将头指针作为一个线性表,孩子结点用单链表存储

    例如:

    数组下标datadatafirstchildfirstchild
    0AA\rightarrow1,{1,\rightarrow}2,null{2,null}
    1BB\rightarrow3,{3,\rightarrow}4,null{4,null}
    2CCnull
    3DDnull
  • 孩子兄弟表示法:二叉树表示法,二叉链表表示法

树、森林、二叉树

  • 零棵或有限棵互不相交的数的集合称为森林
  • 树是 nn 个结点的有限集 TT