数据结构第三周笔记(3)——树(上)(慕课浙大版本--XiaoYu)

178 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情

3.1.4 树的定义和术语

当在树里面插入结点 删除结点的时候比在数组里面方便得多

树的定义

树(Tree) :n(n >= 0)个结点构成的有限集合。

当n = 0时,称为空树;

对于任一棵非空树(n > 0),它具备以下性质:

  1. 树中有一个称为"根(Root)"的特殊结点,用r表示;
  2. 其余结点可分为m(m>0)个互不相交的有限集T1,T2,....,Tm,其中每个集合本身又是一颗树,称为原来树的"子树(SubTree)"
  3. image-20220630212408181

树与非树

不是树的例子

  1. image-20220630212516643
  2. 子树是不相交的;
  3. 除了根结点外,每个结点有且只有一个父结点;
  4. 一颗N个结点的树有N-1条边
  5. 树是保证结点联通的最小的一种连接方式(边最少)
  6. 有一个m棵树的集合(也叫森林)共有k条边,问这m颗树共有多少个结点?k+m

树的一些基本术语

  1. 结点的度(Degree):结点的子树个数
  2. 树的度:树的所有结点中最大的度数
  3. 叶结点(Leaf):度为0的结点
  4. 父结点(Parent):有子树的结点是其子树的根节点的父节点
  5. 子结点(Child):若A结点是B结点的父节点,则称B结点是A结点的子结点;子节点也称孩子结点
  6. 兄弟结点(Sibling):具有同一父节点的各结点彼此是兄弟结点
  7. image-20220630221534749
  8. 祖先结点(Ancestor):沿着树根到某一结点路径上的所有结点都是这个结点的祖先结点
  9. 子孙结点(Descendant):某一结点的子树中的所有结点是这个结点的子孙
  10. 结点的层次(Lever):规定根节点在1层,其他任一结点的层数是其父节点的层数加1
  11. 树的深度(Depth):树的所有结点中的最大层次是这颗树的深度

3.1.1 树的表示

数组实现:把这些结点按顺序存储在数组里面

image-20220630231222581

链表表示:

image-20220630231244287

这样树的结构:每个结点的结构的样子是不一样的。有的结点有3个指针,有的结点有1个指针,有的没有指针。这样整个这个结构的形式都不一样,会给后面的程序实现带来困难(因为访问之前没办法确认会带来多少个儿子)

//另外的构想:能不能为了保持结构的统一,我将每个指针都跟结点中最多的对齐,其他结点不需要的指针就当空指针用。这样的好处就是所有树结点结构是统一的,程序处理起来方便。但同样会带来问题://如果这个树有n个结点,那意味着每个结点有3个指针域,整个树会有3n个指针域,而实际上我们的边只有n-1条,这样就会有2n+1个指针域是空的,造成空间上的浪费

儿子-兄弟表示法

image-20220630235030353

这样可以将整颗树的结点把它串起来

实现效果如下:

image-20220630235200617

这种方法的优点:
1.树种的每个结点结构都是统一的,都是两个指针域,同时它的空间浪费也不大
    n个结点2n个指针域 其中n-1条边。
    意味着n-1个域是非空的,真正空的域是n+1
    
    问题:在用“儿子-兄弟”法表示的树中,如果从根结点开始访问其“次子”的“次子”,所经过的结点数与下面哪种情况一样?(注意:比较的是结点数,而不是路径)
    答案:从根结点开始访问其“长子”的“长子”的“长子”的“长子”

二叉树的图

image-20220630235703723

二叉树特点

  1. 链表实现方法:旋转45度
  2. 每个结点都有两个指针,一个指向左边一个指向右边,每个结点最多是两个儿子
  3. 二叉树就是度为2的一种树
  4. image-20220630235936075