树和森林算法

双亲表示法:(多用与寻找parent,寻找child较为困难)

树的双亲表示法采用一组连续的存储空间来存储每个节点。根节点没有双亲,所以其在数组中存储的值为-1。其余的节点,只需要存储其父节点对应的数组下标即可。

#define MAX_TREE_SIZE 100

typedef struct {
    ElemType data;
    int parent;
} PTNode;

typedef struct {
    PTNode nodes[MAX_TREE_SIZE];
    int n;
} PTree;

孩子表示法:(多用于寻找child,找parent较为困难) 

孩子表示法存储普通树采用的是"顺序表+链表"的组合结构,其存储过程是:从树的根节点开始,使用顺序表依次存储树中各个节点。需要注意,与双亲表示法不同的是,孩子表示法会给各个节点配备链表指针,来存储节点的所有子节点

#define MAX_TREE_SIZE 100

typedef struct CTNode {
    int child;
    struct CTNode *next;
} *ChildPtr;

typedef struct {
    ElemType data;
    ChildPtr firstchild;
} CTBox;

typedef struct {
    CTBox nodes[MAX_TREE_SIZE];
    int n;
} CTtree;

带双亲的孩子链表:

双亲-孩子链表是一种将双亲表示法和孩子表示法结合起来的存储方式。每个节点既存储与它直接相关的双亲节点信息,又存储它的所有子节点信息。

#define MAX_TREE_SIZE 100

typedef struct CTNode *ChildPtr;

typedef struct {
    ElemType data;
    int parent;
    ChildPtr firstchild;
} CTBox;

typedef struct {
    CTBox nodes[MAX_TREE_SIZE];
    int n;
} PCTree;

孩子兄弟表示法:

struct tree_node {
    int value;
    struct tree_node *first_child;  // 左孩子节点指针
    struct tree_node *next_sibling; // 右兄弟节点指针
};

 



树和森林相互转换:

树-->>二叉树

二叉树用左右孩子法存储

树用孩子兄弟表示法存储

他们的存储一样,不同解读有不同的树,可先将树按存储来转换

口诀:兄弟之间加上线,双亲之间去掉线

二叉树-->>转树同理



树的遍历分为:先根,后跟,层次

二叉树的遍历分为:先序,中序,后序,层次

森林的遍历:

1)先序遍历森林

  • 访问森林中第一棵树的根节点
  • 先序遍历第一棵树的根节点的子树森林
  • 先序遍历除去第一棵树之后剩余的树构成的森林
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值