数据结构-树及其概念(下)

94 阅读2分钟

「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战

问:子树是否可以有交集

==注意:树形结构中,子树之间不能有交集,否则就不是树形结构==

  • 子树不相交
  • 除了根结点,每个结点有且仅有一个父节点
  • 一个N个结点的树有N-1条边

树的表示方法:

假设说明树的度为N->最大的节点的度为N
struct TreeNode
{
    int data;
    struct TreeNode* subs[N];
};
//subs是指针数组,是数组
存在的问题:
    1.可能会存在不少空间浪费 ->如果最大的度为N 其它都为012.. N 会存在不少空间的浪费
    2.万一没有限定树的度为多少呢?

未知树的度->使用顺序表
typedef struct TreeNode* SLDataTye;//存放的数据是二叉树结构体
struct TreeNode
{
    int data;
    SeqList s; //s是顺序表结构体里面含一个指针,SLDataType* a ->a是一个数组,SLDataType展开后,a是二级指针,a指向的是存放一级指针SLDataType的数组
};
 使用顺序表,如果空间不够就可以扩容

双亲表示法
struct TreeNode
{
    int parent;//存父亲结点的下标
    int data;//存该结点的数据
};
struct TreeNode arr[10];//arr是结构体数组
    
用数组存放父亲结点的下标

在这里插入图片描述

三叉链

// 三叉链
typedef int BTDataType;
struct BinaryTreeNode
{
    struct BinTreeNode* _pParent; // 指向当前节点的双亲
    struct BinTreeNode* _pLeft; // 指向当前节点左孩子
    struct BinTreeNode* _pRight; // 指向当前节点右孩子
    BTDataType _data; // 当前节点值域
};

最优表示方法:左孩子右兄弟表示法
typedef int DataType;
struct Node
{
    struct Node* firstChil; // 永远指向它的第一个孩子结点
    struct Node* NextBrother; // 指向孩子右边的兄弟
    DataType data; // 结点中的数据域
};

在这里插入图片描述


在这里插入图片描述


如何通过这个方法找到结点的孩子:

通过fristchirld找到第一个孩子,通过第一个孩子的Nextbrother,不断找下一个NextBrother,当Nextbrother为NULL时结束


经典的树形结构:文件系统

在这里插入图片描述


前序后序中序配合构成树 :结论

前序+中序 可以重建树

后序+中序 可以重建树

前序+后序 不可以重建树