博客
关于我
树和二叉树的转换
阅读量:665 次
发布时间:2019-03-15

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

树的表示法

树是数据结构中的一种非常重要的概念,它可以用来描述具有层次关系的数据集合。树的表示法主要有双亲表示法、孩子表示法和兄弟表示法等不同形式。

图像的表示法

在树的表示法中,最常用的两种方式是双亲表示法和孩子表示法。

双亲表示法:每个结点都有一个指向其父结点的指针。

孩子表示法:每个结点都有一个指向其长子结点的指针。

孩子兄弟表示法:每个结点都有一个指向其长子结点的指针,同时每个结点也包含一个指向其兄弟结点的指针。

括号表示法

括号表示法是一种常用的树的表示方法。它通过递归的方式来描述树的结构。例如:

树的括号表示法可以通过递归函数来实现,每个结点的括号表示法包含其长子结点的括号表示法和兄弟结点的括号表示法。

遍历表示法

树的遍历是指按照一定的规则访问树中的每一个结点。常见的树遍历方式包括前序遍历、中序遍历、后序遍历和层序遍历。

双亲表示法

双亲表示法是一种树的表示方式。它通过每个结点存储指向其父结点的指针来实现。这种表示方式简单直观,但在处理复杂树结构时可能不够高效。

孩子表示法

孩子表示法是一种树的表示方式。它通过每个结点存储指向其长子结点的指针来实现。这种表示方式可以很好地反映树的结构特点。

孩子兄弟表示法

孩子兄弟表示法是一种树的表示方式。它通过每个结点存储指向其长子结点的指针,同时每个结点也包含一个指向其兄弟结点的指针。这种表示方式可以很好地支持树的遍历和操作。

树结点

树的结点通常由结构体或类来表示。以下是一个典型的树结点结构定义:

typedef struct CSNode{    Element data;                   //结点数据域    struct CSNode * friendChild;    //长子结点    struct CSNode * nextSibling;    //兄弟结点}CSNode, * CSTree;

树和二叉树的相互转换

树和二叉树之间可以通过孩子兄弟表示法进行相互转换。这种转换方式可以将一般的树结构转化为二叉树,从而方便进行二叉树的操作。以下是一个示意图:

左图是原树;右图是转化之后的树。

孩子兄弟表示法基本操作

孩子兄弟表示法是一种高效的树表示方式。以下是孩子兄弟树的基本操作:

#define NAME_SIZE   255typedef struct{    int id;        char name[NAME_SIZE];}ElementType;typedef struct cbNode{    ElementType data;                  //数据域    struct cbNode * firstChild;       //长子结点    struct cbNode * nextSibling;      //兄弟结点}CBNode, * CBTree;  // *CBTree 二级指针void InitCBTree(CBTree * tree){    *tree = (CBTree)malloc(sizeof(CBNode));    (*tree)->firstChild = NULL;    (*tree)->nextSibling = NULL;}static int id = 0;void CreateCBTree(CBNode ** node){    char inputName[255];    gets(inputName);    if(strcmp(inputName, "\0") == 0) return;    if(*node == NULL){        *node = (CBNode *)malloc(sizeof(CBNode));        (*node)->firstChild = NULL;        (*node)->nextSibling = NULL;    }    (*node)->data.id = ++id;    strcpy((*node)->data.name, inputName);    printf("请输入长子结点:");    CreateCBTree(&(*node)->firstChild);    printf("请输入兄弟结点:");    CreateCBTree(&(*node)->nextSibling);}void PreOrderCBTree(CBNode * node){    if(node != NULL){        printf "[%d, %s] ", node->data.id, node->data.name);        CBNode * p = node->firstChild;        PreOrderCBTree(p);        while(p){            p = p->nextSibling;            PreOrderCBTree(p);        }    }}

转载地址:http://frgmz.baihongyu.com/

你可能感兴趣的文章
NetAssist网络调试工具使用指南 (附NetAssist工具包)
查看>>
Netbeans 8.1启动参数配置
查看>>
NetBeans IDE8.0需要JDK1.7及以上版本
查看>>
NetBeans之JSP开发环境的搭建...
查看>>
NetBeans之改变难看的JSP脚本标签的背景色...
查看>>
netbeans生成的maven工程没有web.xml文件 如何新建
查看>>
netcat的端口转发功能的实现
查看>>
NetCore 上传,断点续传,可支持流上传
查看>>
Netcraft报告: let's encrypt和Comodo发布成千上万的网络钓鱼证书
查看>>
Netem功能
查看>>
netfilter应用场景
查看>>
Netflix:当你按下“播放”的时候发生了什么?
查看>>
Netflix推荐系统:从评分预测到消费者法则
查看>>
netframework 4.0内置处理JSON对象
查看>>
Netgear WN604 downloadFile.php 信息泄露漏洞复现(CVE-2024-6646)
查看>>
Netgear wndr3700v2 路由器刷OpenWrt打造全能服务器(十一)备份
查看>>
netlink2.6.32内核实现源码
查看>>
netmiko 自动判断设备类型python_Python netmiko模块的使用
查看>>
NetMizer 日志管理系统 多处前台RCE漏洞复现
查看>>
NetMizer-日志管理系统 dologin.php SQL注入漏洞复现(XVE-2024-37672)
查看>>