22

本文深入探讨了树和森林的三种存储结构:双亲表示法、孩子链表表示法和树的二叉链表表示法,并详细介绍了如何遍历树和森林。同时,阐述了树的操作如何转化为二叉树的操作,以及森林到二叉树和二叉树到森林的转换规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

严蔚敏视频 笔记22

6.4 树和森林的表示方法

树的三种存储结构

一、双亲表示法
#define MAX_TREE_SIZE 100
//
结点结构
typedef struct PTNode {
    Elem data;
    int parent; //
双亲位置域
} PTNode;

// 树结构
typedef struct {
    PTNode nodes[MAX_TREE_SIZE];
    int r,n; //
根结点的位置和结点个数
} PTree;

用顺序表来表示


二、孩子链表表示法
//
孩子结点结构
typedef struct CTNode {
    int child;
    struct CTNode *next;
} *ChildPtr;

// 双亲结点结构
typedef struct {
    Elem data;
    ChildPtr firstchild; //
孩子链的头指针
} CTBox;

// 树结构
typedef struct {
    CTBox nodes[MAX_TREE_SIZE];
    int n,r; //
结点数和根结点的位置
} CTree;


三、树的二叉链表(孩子-兄弟)存储表示法
typedef struct CSNode {
    Elem data;
    struct CSNode *firstchild,*nextsibling;
} CSNode,*CSTree;

非常类似二叉树的存储结构

将树的操作转换到二叉树的操作

森林和二叉树的对应关系
设森林F=(T1,T2,…Tn);
T1=(root,t11,t12,…t1m);
二叉树B=(LBT,Node(root),RBT);

森林到二叉树的转换规则
F=φB=φ;
否则:

 
ROOT(T1)对应得到Node(root)
 
(t11,t12,…t1m)对应得到
LBT
 
(T2,T3,…Tn)对应得到RBT

二叉树到森林的转换规则
B=φF=φ;
否则:

 
Node(root)对应得到ROOT(T1)
 
LBT对应得到
(t11,t12,…t1m)
 
RBT对应得到(T2,T3,…Tn)

和树对应的二叉树其左右子树的概念变为:左孩子右兄弟

6.7 树和森林的遍历

树的三条搜索路径:
先根遍历
后根遍历
按层次遍历

森林的遍历
先序遍历(依次从左到右对森林中的每一棵树进行先根遍历)
若森林不空则
访问森林中第一棵树的根结点
先序遍历森林中第一棵树的子树森林
先序遍历森林中(除第一棵树外)其余树构成的森林

中序遍历(依次从左到右对森林中的每一棵树进行后根遍历)
若森林不空则
中序遍历森林中第一棵树的子树森林
访问森林中第一棵树的根结点
中序遍历森林中(除第一棵树外)其余树构成的森林

森林的先序遍历对应二叉树的先序遍历
森林的中序遍历对应二叉树的中序遍历

树的遍历算法的应用
一、求树的深度的算法
int TreeDepth(CSTree T) {
    if(!T) return 0;
    else {
        h1=TreeDepth(T->firstchild);
        h2=TreeDepth(T->nextsibling);
        return(max(h1+1,h2));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值