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

108 阅读2分钟

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

二叉树及存储结构

3.2.1 二叉树的定义及性质

二叉树的定义

    二叉树T:一个有穷的结点集合
​
•       这个集合可以为空
        若不为空,则它是由根结点和称为其左子树TL和右子树TR的两个不相交的二叉树组成(L和R是下标)

二叉树具体五种基本形态

image-20220701000338791

二叉树的子树有左右之分

image-20220701000422530

特殊的二叉树

斜二叉树(Skewed Binary Tree)
  1. 只有左边或者只有右边,相当于一个链表
  2. image-20220701000612336
完美二叉树(Perfect Binary Tree)

或者叫做满二叉树(Full Binary Tree)

image-20220701000716448

特点: 一个深度为k(>=-1)且有2^(k+1) - 1个结点的二叉树称为完美二叉树。 满二叉树

完全二叉树(Complete Binary Tree)

有n个结点的二叉树,对树种结点按从上到下,从左到右的顺序进行编号,编号为i(1 <= i <= n)结点与满二叉树中编号为i结点在二叉树中位置相同
跟上方的区别就是除了最底下一层可以右边缺一点,上面跟满二叉树是一样的。最底下一层左边顺序不能乱

二叉树的几个重要性质

image-20220701001640388

叶结点的总数等于有两个儿子的结点的总数加1

有一颗二叉树,其两个儿子的结点个数为15个,一个儿子的结点个数为32个,问该二叉树的叶结点个数是多少?
16

二叉树的抽象数据类型定义

类型名称:二叉树
数据对象集:一个有穷的结点集合。
    若不为空,则由根结点和其左、右二叉子树组成。
    
操作集: BT属于BinTree,Item属于ElementType
重要操作有:
1.Boolean IsEmpty(BinTree BT):判别BT是否为空;
2.void Traversal(BinTree BT):遍历,按某顺序访问每个结点;(重要)
3.BinTree CreateBinTree():创建一个二叉树
常用的遍历方法
1.void PreOrderTraversal(BinTree BT)://先序--根、左子树、右子树
2.void InOrderTraversal(BinTree BT)://中序--左子树、根、右子树
3.void PostOrderTraversal(BinTree BT)://后序--左子树、右子树、根
4.void LevelOrderTraversal(BinTree BT)://层次遍历(层序遍历,从上到下、从左到右

3.2.2 二叉树的存储结构

1.顺序存储结构

完全二叉树:按从上至下,从左到右顺序存储n个结点的完全二叉树的结点父子关系;
//这个树最适合数组方式解决

image-20220701003345507

  1. 非根结点(序号 i > 1)的父节点的序号是[i/2]

    1. 这句话的意思就是说假设我们目前知道M结点时6,如果想知道它的父节点就是6/2=3,Q结点就是7/2=3.5,把小数去掉,父节点一样是3
  2. 结点(序号为i)的左孩子结点的序号是2i,(若2i <= n,否则没有左孩子)

    1. 举例:意思就是B左孩子是C,O的左孩子是M
  3. 结点(序号为i)的右孩子结点的序号是2i+1,(若2i+1 <= n,否则没有右孩子)

    1. 举例:类似上方的意思B右孩子是S...

一般二叉树也可以采用这种结构,缺点:但会造成空间浪费....(将缺少的结点补上一个空结点)

image-20220701004348299

image-20220701004413217

问题:
​
如果参照完全二叉树的表示方法用数组存储下面这棵二叉树,那么结点e所对应的数组下标是多少(树根下标为1)?
答案:6

image-20220701004541010

2.链表存储

image-20220701004912537

typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
}

image-20220701005059244