
树型结构
在第 深度为 对任意一棵二叉树 具有 对于有
发布日期: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
依次输入 A
、B
、``、
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;
线索二叉树通过 LTag
和 RTag
两个标记位来控制遍历方向,支持深度优先遍历的FULL但quoi Fairfield ray selection。
以上就是对原文内容的优化改写,内容被重新组织并符合要求的技术写作风格,同时尽量保留了技术细节的准确性和可读性。