树(C语言)

树的定义

树(Tree): n ( n 0 ) n(n \geq 0) 个结点构成的有限集合。当n=0时,称为空树
对于任一棵非空树 n > 0 n>0 ),它具有以下性质:

  • 树中有一个称为“根(Root)”的特殊结点,用r表示;

  • 其余结点可分为 m ( m > 0 ) m(m>0) 互不相交的有限集 T 1 , T 2 , , T m T_1,T_2,……,T_m ,其中每一个集合本身又是一棵树,称为原来树的“子树(SubTree)
    树与其子树

  • 子树是互不相交的;

  • 除了根节点外,每个结点有且仅有一个父节点
    不是树的几个例子:
    不是树的几个例子

  • 一棵N个节点的树有N-1条边。(除了根结点,其余节点往上都有一条边)

树的一些基本术语

  1. 结点的度(Degree):结点的子树个数(即结点下面直接连着的边的条数。)

  2. 树的度:树中所有结点中最大的度数

  3. 叶结点(Leaf)度为0的结点

    扫描二维码关注公众号,回复: 8782063 查看本文章
  4. 父结点(Parent):有子树的的结点是其子树的根结点的父结点

  5. 子结点(Child):若A结点是B结点的父结点,则称B结点是A结点的子结点,子结点也称孩子结点。

  6. 兄弟结点(Sibling):具有同一父结点的各结点彼此是兄弟结点。

  7. 路径和路径的长度:从结点 n 1 n_1 n k n_k 的路径为一个结点序列 n 1 , n 2 , . . . , n k n_1,n_2,...,n_k , n i n_i n i + 1 n_{i+1} 的父结点。路径所包含边的个数为路径的长度

  8. 祖先结点(Ancestor):沿树根到某一结点路径上的所有结点都是这个结点的祖先结点。

  9. 子孙结点(Descendant):某一结点的子树中的所有结点是这个结点的子孙。

  10. 结点的层次(Level):规定根结点在1层,其他任一结点的层数是其父结点的层数加1。

  11. 树的深度(Depth):树中所有结点中最大层次是这棵树的深度。

树的表示

树

  1. 数组实现
    很难,因为不容易判别一个结点的父结点子结点和兄弟结点等等,故一般不用。
  2. 链表实现
    1. 结点不一致
      链表实现1
      由于代码方面很难设计,所以一般不用。
    2. 结点一致
      1. 按照树的度来设计结点指针域
        若树的度为 d d ,则设计 d d 个指针域。但是有些结点不一定有 d d 个子结点,故会造成空间的浪费。
        假设有 n n 个结点,那么会被设计 n × d n \times d 个指针域,但是 n n 个结点只有 n 1 n-1 条边,所以将会有 n × d n + 1 n \times d-n+1 个指针域的空间被浪费。

      2. 儿子-兄弟表示法:每个结点设计两个指针域。第一个用来指向该结点的第一个子结点,第二个用来指向该节点的兄弟结点
        链表实现2

        针对上面的树,得到的表示图形如下:
        链表实现3

        假设有 n n 个结点,那么会被设计 2 n 2n 个指针域, n n 个结点有 n 1 n-1 条边,所以只会有 n + 1 n+1 个指针域的空间被浪费。
        将链表表示图旋转45度,将会得到一个二叉树的图。

        转变为二叉树

        由此可见,一般的树都可以用二叉树链表来实现,所以二叉树的内容在树中是很重要的,接下来着重学习二叉树。

发布了12 篇原创文章 · 获赞 2 · 访问量 790

猜你喜欢

转载自blog.csdn.net/qq_42313728/article/details/100144631