二叉树的三叉链表存储

【考研复习】二叉树的特殊存储|三叉链表存储二叉树、一维数组存储二叉树、线索二叉树 使用中序遍历的顺序进行线索化。代码中有一个难以理解的点,为什么不用p直接找后继,而是使用了前驱结点找后继。实际上,不是不用p找后继,而是从p找不到后继,所以只能间接地找前驱的后继,这样的方式找后继,明白了这点,代码就不难懂了。另外设计一个填充函数,函数功能是将所有结点的parent结点填充正确。 阅读详情

http://hi.baidu.com/fire_man/blog/item/32831f0f6a04f8286159f3ab.html

/* c6-6.h 二叉树的三叉链表存储表示 */

typedef struct BiTPNode

{

    TElemType data;

    struct BiTPNode *parent,*lchild,*rchild; /* 双亲、左右孩子指针 */

}BiTPNode,*BiPTree;

 

/* bo6-6.c 二叉树的三叉链表存储(存储结构由c6-6.h定义)的基本操作(21个) */

Status InitBiTree(BiPTree *T)

{ /* 操作结果: 构造空二叉树T */

    *T=NULL;

    return OK;

}

void DestroyBiTree(BiPTree *T)

{ /* 初始条件: 二叉树T存在。操作结果: 销毁二叉树T */

    if(*T) /* 非空树 */

    {

      if((*T)->lchild) /* 有左孩子 */

        DestroyBiTree(&(*T)->lchild); /* 销毁左孩子子树 */

      if((*T)->rchild) /* 有右孩子 */

        DestroyBiTree(&(*T)->rchild); /* 销毁右孩子子树 */

      free(*T); /* 释放根结点 */

      *T=NULL; /* 空指针赋0 */

    }

}

void Create(BiPTree *T) /* CreateBiTree()调用 */

{ /* 按先序次序输入二叉树中结点的值(可为字符型或整型,在主程中定义), */

    /* 构造仅缺双亲指针的三叉链表表示的二叉树T。变量Nil表示空(子)树 */

    TElemType ch;

#ifdef CHAR

    scanf("%c",&ch);

#endif

#ifdef INT

    scanf("%d",&ch);

#endif

    if(ch==Nil) /* 空 */

      *T=NULL;

    else

    {

      *T=(BiPTree)malloc(sizeof(BiTPNode));

      if(!*T)

        exit(OVERFLOW);

      (*T)->data=ch; /* 生成根结点 */

      Create(&(*T)->lchild); /* 构造左子树 */

      Create(&(*T)->rchild); /* 构造右子树 */

    }

}

typedef BiPTree QElemType; /* 设队列元素为二叉树的指针类型 */

#include"c3-2.h"

#include"bo3-2.c"

Status CreateBiTree(BiPTree *T)

{ /* 按先序次序输入二叉树中结点的值(可为字符型或整型,在主程中定义), */

    /* 构造三叉链表表示的二叉树T */

    LinkQueue q;

    QElemType a;

    Create(T); /* 构造二叉树(缺双亲指针) */

    if(*T) /* 非空树 */

    {

      (*T)->parent=NULL; /* 根结点的双亲为"空" */

      InitQueue(&q); /* 初始化队列 */

      EnQueue(&q,*T); /* 根指针入队 */

      while(!QueueEmpty(q)) /* 队不空 */

      {

        DeQueue(&q,&a); /* 出队,队列元素赋给a */

        if(a->lchild) /* 有左孩子 */

        {

          a->lchild->parent=a; /* 给左孩子的双亲指针赋值 */

          EnQueue(&q,a->lchild); /* 左孩子入队 */

        }

        if(a->rchild) /* 有右孩子 */

        {

   a->rchild->parent=a; /* 给右孩子的双亲指针赋值 */

          EnQueue(&q,a->rchild); /* 右孩子入队 */

        }

      }

    }

    return OK;

}

#define ClearBiTree DestroyBiTree

Status BiTreeEmpty(BiPTree T)

{ /* 初始条件: 二叉树T存在。操作结果: 若T为空二叉树,则返回TRUE,否则FALSE */

    if(T)

      return FALSE;

    else

      return TRUE;

}

int BiTreeDepth(BiPTree T)

{ /* 初始条件: 二叉树T存在。操作结果: 返回T的深度 */

    int i,j;

    if(!T)

      return 0;

    if(T->lchild)

      i=BiTreeDepth(T->lchild);

    else

      i=0;

    if(T->rchild)

      j=BiTreeDepth(T->rchild);

    else

      j=0;

    return i>j?i+1:j+1;

}

TElemType Root(BiPTree T)

{ /* 初始条件: 二叉树T存在。操作结果: 返回T的根 */

    if(T)

      return T->data;

    else

      return Nil;

}

TElemType Value(BiPTree p)

{ /* 初始条件: 二叉树T存在,p指向T中某个结点 */

    /* 操作结果: 返回p所指结点的值 */

    return p->data;

}

void Assign(BiPTree p,TElemType value)

{ /* 给p所指结点赋值为value */

    p->data=value;

}

BiPTree Point(BiPTree T,TElemType e)

{ /* 返回二叉树T中指向元素值为e的结点的指针。加 */

    LinkQueue q;

    QElemType a;

    if(T) /* 非空树 */

    {

      InitQueue(&q); /* 初始化队列 */

      EnQueue(&q,T); /* 根结点入队 */

      while(!QueueEmpty(q)) /* 队不空 */

      {

        DeQueue(&q,&a); /* 出队,队列元素赋给a */

        if(a->data==e)

          return a;

        if(a->lchild) /* 有左孩子 */

          EnQueue(&q,a->lchild); /* 入队左孩子 */

        if(a->rchild) /* 有右孩子 */

          EnQueue(&q,a->rchild); /* 入队右孩子 */

      }

    }

    return NULL;

}

TElemType Parent(BiPTree T,TElemType e)

{ /* 初始条件: 二叉树T存在,e是T中某个结点 */

    /* 操作结果: 若e是T的非根结点,则返回它的双亲,否则返回"空" */

    BiPTree a;

    if(T) /* 非空树 */

    {

      a=Point(T,e); /* a是结点e的指针 */

      if(a&&a!=T) /* T中存在结点e且e是非根结点 */

        return a->parent->data; /* 返回e的双亲的值 */

    }

    return Nil; /* 其余情况返回空 */

}

TElemType LeftChild(BiPTree T,TElemType e)

{ /* 初始条件: 二叉树T存在,e是T中某个结点 */

    /* 操作结果: 返回e的左孩子。若e无左孩子,则返回"空" */

    BiPTree a;

    if(T) /* 非空树 */

    {

      a=Point(T,e); /* a是结点e的指针 */

      if(a&&a->lchild) /* T中存在结点e且e存在左孩子 */

        return a->lchild->data; /* 返回e的左孩子的值 */

    }

    return Nil; /* 其余情况返回空 */

}

TElemType RightChild(BiPTree T,TElemType e)

{ /* 初始条件: 二叉树T存在,e是T中某个结点 */

    /* 操作结果: 返回e的右孩子。若e无右孩子,则返回"空" */

    BiPTree a;

    if(T) /* 非空树 */

    {

      a=Point(T,e); /* a是结点e的指针 */

      if(a&&a->rchild) /* T中存在结点e且e存在右孩子 */

        return a->rchild->data; /* 返回e的右孩子的值 */

    }

    return Nil; /* 其余情况返回空 */

}

TElemType LeftSibling(BiPTree T,TElemType e)

{ /* 初始条件: 二叉树T存在,e是T中某个结点 */

    /* 操作结果: 返回e的左兄弟。若e是T的左孩子或无左兄弟,则返回"空" */

    BiPTree a;

    if(T) /* 非空树 */

    {

      a=Point(T,e); /* a是结点e的指针 */

      if(a&&a!=T&&a->parent->lchild&&a->parent->lchild!=a) /* T中存在结点e且e存在左兄弟 */

        return a->parent->lchild->data; /* 返回e的左兄弟的值 */

    }

    return Nil; /* 其余情况返回空 */

}

TElemType RightSibling(BiPTree T,TElemType e)

{ /* 初始条件: 二叉树T存在,e是T中某个结点 */

    /* 操作结果: 返回e的右兄弟。若e是T的右孩子或无右兄弟,则返回"空" */

    BiPTree a;

    if(T) /* 非空树 */

    {

      a=Point(T,e); /* a是结点e的指针 */

      if(a&&a!=T&&a->parent->rchild&&a->parent->rchild!=a) /* T中存在结点e且e存在右兄弟 */

        return a->parent->rchild->data; /* 返回e的右兄弟的值 */

    }

    return Nil; /* 其余情况返回空 */

}

Status InsertChild(BiPTree p,int LR,BiPTree c) /* 形参T无用 */

{ /* 初始条件: 二叉树T存在,p指向T中某个结点,LR为0或1,非空二叉树c与T */

    /*            不相交且右子树为空 */

    /* 操作结果: 根据LR为0或1,插入c为T中p所指结点的左或右子树。p所指结点 */

    /*            的原有左或右子树则成为c的右子树。 */

    if(p) /* p不空 */

    {

      if(LR==0)

      {

        c->rchild=p->lchild;

        if(c->rchild) /* c有右孩子(p原有左孩子) */

          c->rchild->parent=c;

        p->lchild=c;

        c->parent=p;

      }

      else /* LR==1 */

      {

        c->rchild=p->rchild;

        if(c->rchild) /* c有右孩子(p原有右孩子) */

          c->rchild->parent=c;

        p->rchild=c;

        c->parent=p;

      }

      return OK;

    }

    return ERROR; /* p空 */

}

Status DeleteChild(BiPTree p,int LR) /* 形参T无用 */

{ /* 初始条件: 二叉树T存在,p指向T中某个结点,LR为0或1 */

    /* 操作结果: 根据LR为0或1,删除T中p所指结点的左或右子树 */

    if(p) /* p不空 */

    {

      if(LR==0) /* 删除左子树 */

        ClearBiTree(&p->lchild);

      else /* 删除右子树 */

        ClearBiTree(&p->rchild);

      return OK;

    }

    return ERROR; /* p空 */

}

void PreOrderTraverse(BiPTree T,Status(*Visit)(BiPTree))

{ /* 先序递归遍历二叉树T */

    if(T)

    {

      Visit(T); /* 先访问根结点 */

      PreOrderTraverse(T->lchild,Visit); /* 再先序遍历左子树 */

      PreOrderTraverse(T->rchild,Visit); /* 最后先序遍历右子树 */

    }

}

void InOrderTraverse(BiPTree T,Status(*Visit)(BiPTree))

{ /* 中序递归遍历二叉树T */

    if(T)

    {

      InOrderTraverse(T->lchild,Visit); /* 中序遍历左子树 */

      Visit(T); /* 再访问根结点 */

      InOrderTraverse(T->rchild,Visit); /* 最后中序遍历右子树 */

    }

}

void PostOrderTraverse(BiPTree T,Status(*Visit)(BiPTree))

{ /* 后序递归遍历二叉树T */

    if(T)

    {

      PostOrderTraverse(T->lchild,Visit); /* 后序遍历左子树 */

      PostOrderTraverse(T->rchild,Visit); /* 后序遍历右子树 */

      Visit(T); /* 最后访问根结点 */

    }

}

void LevelOrderTraverse(BiPTree T,Status(*Visit)(BiPTree))

{ /* 层序遍历二叉树T(利用队列) */

    LinkQueue q;

    QElemType a;

    if(T)

    {

      InitQueue(&q);

      EnQueue(&q,T);

      while(!QueueEmpty(q))

      {

        DeQueue(&q,&a);

        Visit(a);

        if(a->lchild!=NULL)

          EnQueue(&q,a->lchild);

        if(a->rchild!=NULL)

          EnQueue(&q,a->rchild);

      }

    }

}

 

二叉树的三叉链表存储结构的简单实现 三叉链表存储结构比二叉链表存储多了一个指向父节点的引用,虽然增加了空间开销,但是提升的查找的速度。下面是源代码,功能不多,但是可以帮助大家很快理解这种数据结构。 //a simple example to ThreeLinkBinTree //HanChun at Xidian University package mywork.c20150611; public class ThreeLi 阅读详情

相关推荐

二叉树的三叉链表存储表示

二叉树的三叉链表存储表示.

三叉链表存储二叉树

二叉树的三叉链式存储 三叉链式存储的思想是让每个节点不仅“记住”它的左,右两个节点,还要“记住”它的父节点,因此每个节点需要left,right,parent三个指针。 三叉链表存储方式是对二叉链表的一种改进,通过为树节点添加一个parent引用,可以让每个节点都能非常方便...

chichuowei5964的博客 3051

二叉树之三叉链表非递归运算

数据结构源码C语言描述续,前面上传文档描述了二叉树的递归算法,本篇描述了二叉树三叉链表的非递归操作,以及测试程序:

二叉树的三叉链表存储表示 (第六章 P126)

二叉树的三叉链表存储结构比二叉链表多一个指向双亲结点的指针,因此,求双亲和左右兄弟都很容易。但在构造二叉树时要另给双亲指针赋值,从而增加了复杂度。由于三叉链表和二叉链表在结构上的相似性,它们有些相应的基本操作也很类似。 二叉树的三叉链表存储结构: 右图为左图的三叉链表存储结构: typedef int Status; /* St...

但行好事,莫问前程 4501

数据结构5.9二叉树的链式存储-三叉链表

本节主要讲述二叉树的三叉链表存储结构和相关操作

创建动态代理对象bean,并动态注入到spring容器中

使用过Mybatis的同学,应该都知道,我们只需要编写mybatis对应的接口和mapper XML文件即可,并不需要手动编写mapper接口的实现。这里mybatis就用到了JDK动态代理,并且将生成的接口代理对象动态注入到Spring容器中。 这里涉及到几个问题。也许有同学会有疑问,我们直接编写好类,加入@Component等注解不是可以注入了吗?或者在配置类(@Configuration)...

lichuangcsdn的博客 3万+

三叉链表存储——二叉树(Java)

每个节点记住其左右子节点以及父节点; package com.answer.binaryTree; public class ThreeLinkBinTree { private static class Node{ private String data; private Node left; private Node right; ...

Answer0902的博客 1136

【STM32】433MHz OOK信号软解码实战:从EV1527协议到嵌入式实现

本文详细介绍了基于STM32微控制器实现433MHz OOK信号软解码的完整实战过程。文章从EV1527协议解析入手,重点阐述了利用STM32的GPIO和定时器进行信号采样、脉宽还原、同步头识别以及数据位判决的核心算法,并提供了对抗无线干扰的容错优化策略,帮助开发者深入理解并掌握低成本无线通信的嵌入式实现方案。

weixin_29299807的博客 784

二叉树的三叉链表存储结构

// c6-6.h 二叉树的三叉链表存储结构(见图6.15) typedef struct BiTPNode { TElemType data; BiTPNode *parent,*lchild,*rchild; // 双亲、左右孩子指针 }BiTPNode,*BiPTree; 二叉树的三叉链表存储结构比二叉链表多一个指向双亲结点的指针,因此,求双亲和 左右兄弟都很容易。但在构...

weixin_30533797的博客 1471

LaMAR数据集下载和使用流程

LaMAR数据集

qq_51745206的博客 971

微波传感器 - 从原理到实战,解锁非接触感知新维度

本文深入解析微波传感器的工作原理,重点阐述了其基于多普勒效应的非接触感知机制,并对比了红外、超声波等技术的优劣。通过树莓派Pico与RCWL-0516模块的实战案例,展示了如何构建区域入侵检测器,并探讨了微波传感器在智能家居、工业自动化及汽车电子等领域的广阔应用前景。

weixin_29306571的博客 223

C++实现将二叉链表存储的二叉树转储到三叉链表中

考试出现的算法题,好像网上没人遇到,贴一下希望能帮助到需要的人。 #include <iostream> using namespace std; typedef struct BTNODE { char data; struct BTNODE *lchild,*rchild; }BTNODE,*Btree; /* 二叉树的三叉链表存储表示 */ typedef struct BiTPNode { char data; struct BiTPNode *parent,*lc

qq_31096459的博客 538

搭建ROS小车真的难吗?

搭建ROS小车真的难吗?不难 1.引言 本着为大家谋福利的心态,根据自己以往的开发经验,打算写一个从零开始制作一个可以实现地图构建和导航的ROS小车。目前某宝上面有很多现成产品,但是我个人认为,一个好的移动机器人开发工程师,应该对机器人的整个流程都能具备维护的能力,然后再深入研究其中一个方向即可。看到网上很少有整个系列的开发教程,看到同学们大多东拼西凑,浪费了不少时间。我就想着利用空余时间,将我本人的开发过程输出给大家。有基础理论、有实际工程代码、有丰富的学习资料,尽最大努力帮大家进入移动机器人的大门。 国

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 1万+

二叉树的三叉链表存储(java实现)

package com.fcy.dataStruct; /** * 与二叉树的二叉链表存储相比,三叉链表存储 * 多了一个指针域来记录当前节点的父节点 */ class ThreeLinkBinTree{ public static class TreeNode{ Object data; TreeNode left; //左子节点 TreeNode rig

funcy的专栏 2788

Python从0到100(一):初识Python及安装Pycharm

Python从0到100(一):初识Python及安装Pycharm。Python是由荷兰人吉多·范罗苏姆(Guido von Rossum)发明的一种编程语言,是目前世界上最受欢迎和拥有最多用户群体的编程语言。

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 8万+

Hermes 教程 05:多 Agent 编排

本文介绍了Hermes v0.13.0中的四种多Agent协作模式:1)delegate_task快速子任务模式,适合2-3个独立并行任务;2)spawn子Agent模式,实现零成本并行多步流水线;3)tmux交互子Agent模式,支持长期自主任务;4)全新Kanban看板系统,提供持久化AI团队协作框架。各模式在隔离级别、时长、工具访问和适用场景上存在差异,其中spawn模式通过独立上下文窗口实现零上下文成本。文章详细说明了每种模式的使用方法、限制条件和典型应用场景,并提供了具体代码示例和可视化流程图。K

程序猿_三产 537

写出二叉树的二叉链表和三叉链表的存储结构_二叉树04--存储结构

二叉树的链式存储结构二叉树的各结点随机地存储在内存空间中,结点之间的 逻辑关系用指针来链接。 • 二叉链表 • 指针 left 和 right,分别指向结点的左孩子和右孩子 • 三叉链表 • 指针 left 和 right,分别指向结点的左孩子和右孩子 • 增加一个父指针二叉链表 三叉链表指向父母的指针parent, “向上”能力 BinaryTreeNode类中增加两个私有数据成员typedef...

weixin_39907939的博客 796

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

二叉树 之 C++实现(三叉链表存储结构)

满二叉树和完全二叉树适合顺序存储结构,一般二叉树比较适合链式存储结构。 最差情况下,一个深度k只有k个结点的树需要长度为的顺序存储空间,链式存储空间仅需要k个节点的存储空间。 下面是链式存储的两种结点结构: 上- 含两个指针的结点结构(组成的链表被称为二叉链表);下- 含三个指针的结点结构(三叉链表)。 (其中 Lchild:指向左结点的指针 Parent:指向双亲结点的指针 Rchild:指向右结点的指针) Lchild data Rchild Lchi...

Baimax的博客 2322

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java用三叉链表构建二叉树_二叉树的三叉链表存储(java实现)

package com.fcy.dataStruct;/*** 与二叉树的二叉链表存储相比,三叉链表存储* 多了一个指针域来记录当前节点的父节点*/class ThreeLinkBinTree{public static class TreeNode{Object data;TreeNode left; //左子节点TreeNode right; //右子节点TreeNode ...

weixin_42499882的博客 483

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java用三叉链表构造二叉树_Java基础 - 二叉树的三叉链表存储

package com.yc.tree;/*** @author WB* @param ** 三叉链表存储的思想是让每个节点不仅“记住”它的左、右两个子节点,还要“记住”它的父节点,因此需要为每个节点增加left、right和parent* 三个指针,分别引用该节点的左、右两个子节点和父节点。因此,三叉链表的每个节点有如下图所示的结构。* ↑parent* _│_______________...

weixin_39889487的博客 543

二叉树的三叉链表存储及其Java实现

三叉链表存储的思想是让每个节点持有三个引用parent、left、right,分别指向其父节点、左子节点和右子节点。如下图所示: 因此,三叉链表存储的节点大致如: class Node{         T data;         Node parent;         Node left;         Node right;     }   Ja

生命在于折腾 3303

使用java实现二叉树的三叉链表存储

        二叉链表和三叉链表实现二叉树的存储不同之处在于,三叉链表中的每一个结点多了一个指向父节点的区域,其他的地方和二叉链表没有什么区别,实现的思路和二叉链表一致,这里就不再赘述了,详情可以看上一篇二叉链表实现二叉树存储。直接上代码,不多BB。                             二叉树三叉链表存储的java实现 java代码如下: public class T...

风动云彩 1543

二叉树的三叉链表存储和基本操作

三叉链表存储表示 改进于二叉链表,增加指向父节点的指针,能更好地实现结点间的访问。 存储结构 /* 二叉树的三叉链表存储表示 */ typedef struct BiTPNode { TElemType data; struct BiTPNode *parent,*lchild,*rchild; /* 双亲、左右孩子指针 */ }BiTPNode,*B...

weixin_34355715的博客 556
上一篇: 链表操作大全
下一篇: 树的二叉链表(孩子-兄弟)存储
K行天下
博客等级 码龄19年 358粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值