树型结构
发布日期:2021-05-15 01:18:35 浏览次数:17 分类:精选文章

本文共 2709 字,大约阅读时间需要 9 分钟。

优化文本内容

树的双亲表示法

定义如下:

  • #define MAX_TREE_SIZE 100:定义树的最大结点数。
  • n 3:定义树的结点度数。
  • typedef int ElemType:定义结点数据类型。
  • struct PTNode:表示父节点结构体。包含:
    • ElemType data:结点数据。
    • int parent:双亲位置。
    • int child[n]:子结点位置数组。
    • int rightSib:右兄弟结点位置。
  • struct PTree:树的主结构体。包含:
    • PTNode nodes[MAX_TREE_SIZE]:全局结点数组。
    • int r:树根节点位置。
    • int n:树的结点总数。

树的孩子表示法

定义如下:

  • #define MAX_TREE_SIZE 100:定义树的最大结点数。
  • typedef char ElemType:定义结点数据类型。
  • struct CTNode:表示孩子节点结构体。包含:
    • int child:孩子结点的下标。
    • struct CTNode* next:指向下一个孩子结点的指针。
  • struct CTBox:树节点结构体。包含:
    • ElemType data:节点数据。
    • int parent:双亲节点下标。
    • ChildPtr firstchild:指向第一个孩子的指针。
  • struct Tree:树实例结构体。包含:
    • CTBox nodes[MAX_TREE_SIZE]:结点数组。
    • int r, n:树的根位置和结点总数。

二叉树的基本性质

  • 在第 i 层上,至多有 2^(i-1) 个结点(i >= 1)。
  • 深度为 k 的二叉树,至多有 2^k - 1 个结点(k >= 1)。
  • 对任意一棵二叉树 T,如果其终端结点数为 N0,度为 2 的结点数为 N2,则 N0 = N2 + 1
  • 具有 n 个结点的完全二叉树,深度为 ⌊log₂n⌋ + 1
  • 对于有 n 个结点的完全二叉树,深度为 ⌊log₂n⌋ + 1,满足以下性质:
    • 5.1:如果 i = 1,则结点 i 是二叉树的根,无双亲;如果 i > 1,其双亲是结点 ⌊i/2⌋
    • 5.2:如果 2i > n,则结点 i 无左孩子(结点 i 为叶子结点);否则其左孩子是结点 2i
    • 5.3:如果 2i + 1 > n,则结点 i 无右孩子;否则其右孩子是结点 2i + 1
  • 二叉树的链式结构

    二叉树可以通过链表结构实现。定义如下:

    typedef struct BiTNode {    struct BiTNode* LChild;  // 左孩子节点    struct BiTNode* RChild;  // 右孩子节点    ElemType data;         // 用户数据} BiTNode*, BiTree;

    二叉树的遍历

    二叉树的遍历是指从根结点出发,按照特定顺序依次访问所有结点,每个结点仅被访问一次。常见的遍历方式有:

  • 前序遍历

    • 访问根结点 → 左子树 → 右子树。
  • 中序遍历

    • 访问左子树 → 根结点 → 右子树。
  • 后序遍历

    • 访问左子树 → 右子树 → 根结点。
  • 层序遍历

    • 按层从上到下逐层访问结点,在同一层内按左→右顺序访问。
  • 创建二叉树(前序遍历)

    生成示例二叉树:

    AB  \    C   / \  D   E

    依次输入 AB``、C 、`D`、`E 即可生成上述二叉树。以下是创建代码示例:

    代码详解

    #include 
    #include
    #include
    #define NULL nullptrtypedef enum { Çocuk, BAB, Parent, En найд灭} ChildStatus;typedef struct { Elemtype data; struct BiTNode* LChild; struct BiTNode* RChild;} BiTNode;void Visit(Elemtype c, int Level) { printf("字符 %c 位于第 %d 层\n", c, Level);}void CreateBiTree(BiTree* T) { Elemtype c; if (*T == NULL) { *T = NULL; } else { scanf("%c", &c); (*T) = (BiTNode*)malloc(sizeof(BiTNode)); (**T).data = c; CreateBiTree(&(**T).LChild); // 左孩子 CreateBiTree(&(**T).RChild); // 右孩子 }}void PreOrderTraverse(BiTree T, int Level) { if (T != NULL) { Visit(T->data, Level); PreOrderTraverse(T->LChild, Level + 1); PreOrderTraverse(T->RChild, Level + 1); }}int main() { BiTree T = NULL; CreateBiTree(&T); PreOrderTraverse(T, 1); free(T); return 0;}

    线索二叉树

    线索二叉树是一种通过线索(指针)连接节点的二叉树表示方法。其节点结构定义如下:

    typedef struct {    Elemtype data;    int LTag;   // 0表示执行左孩子,1表示前驱节点    int RTag;   // 0表示执行右孩子,1表示前驱节点    struct TBiTNode* LChild;    struct TBiTNode* RChild;} TBiTNode*, TBiTree;

    线索二叉树通过 LTagRTag 两个标记位来控制遍历方向,支持深度优先遍历的FULL但quoi Fairfield ray selection。


    以上就是对原文内容的优化改写,内容被重新组织并符合要求的技术写作风格,同时尽量保留了技术细节的准确性和可读性。

    上一篇:Qt常用控件\机制
    下一篇:字符串的比较

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2025年05月11日 15时57分25秒