当前位置: 首页 > news >正文

【数据结构】树形结构——线索二叉树

  二叉树的遍历实际上是对一个非线性结构进行线性化的操作,使结点按照某个次序进行排列。以二叉链表作为存储结构时,只能找到结点的左、右孩子信息,而不能直接得到该结点在任一遍历序列中的前驱和后继信息,这种信息只有在遍历的动态过程中才能得到。这对于经常需要进行查找结点前驱或后继的访问不方便。

  根据二叉树的特性,n个结点的二叉树,采用链式存储结构时,有n+1个空链域,可以利用这些空链域存放指向结点的直接前驱和直接后继结点的指针。为此做如下规定:当结点的左指针为空(即无左子树)时,令该指针指向按某种方式遍历二叉树时该结点的前驱结点;当结点的右指针为空(即无右子树)时,令该指针指向按某种方式遍历二叉树时该结点的后继结点。为了避免概念混淆,可定义这种指向结点的前驱或后继的指针信息为线索。

typedef struct BiThrNode
{
    ElemType data;
    struct BiThrNode *lchild,*rchild;   //左右指针
    int ltag,rtag;                      //左右指针类型标志,0表示指针,1表示线索
}*BiThrTree;

  为了方便起见,依照线性表的存储结构,在二叉树的线索链表上也添加一个头结点,并令其lchild域的指针指向二叉树的根结点,其rchild域指针指向某种次序遍历时访问的最后一个结点;反之,令二叉树中序序列中第一个结点的lchild域指针和最后一个结点rchild域的指针均指向头结点。这样二叉树建立了一个双向线索链表。

  在线索二叉树上进行遍历,只要先找到序列中的第一个结点,然后依次找结点后继直至其后继为空时为止。例如,在中序线索二叉树中寻找某个结点的后继结点有以下两种情况:

(1)若结点的右标志位1,则其右指针指向的结点就是后继。

(2)若结点的右标志位0,则其右指针指向右子树,根据中序遍历的定义,沿着右子树寻找最左的结点,即顺着右子树的左指针向下,直到左标志为1的结点,就是其后继结点。

由此可以给出中序线索二叉树的遍历算法。 

void InOrderTraverse_Thr(BiThrTree root)
{
    p=root->lchild;         //p指向二叉树的根结点
    while(p!=root)          //若不为空树
    {
        while(p->ltag==0)
            p=p->lchild;
        printf("%c",p->data);    //访问其左子树为空的结点
        while(p->rtag==1&&p->rchild!=root)     //访问右线索所指后继结点
        {
            p=p->rchild;
            printf("c",p->data);
        }
        p=p->rchild;        //进入右子树
    }
}

  对于先序线索二叉树和中序线索二叉树,可以不用栈来实现二叉树的遍历,而对于后序线索二叉树,在进行后续遍历时仍需要栈。可分为三种情况:

(1)若结点x是二叉树的根,则后继为空。

(2)若结点x是双亲的右孩子或是其双亲的左孩子且其双亲没有右子树,则其后继结点为双亲结点。

(3)若结点x是其双亲的左孩子,且其双亲有右子树,则其后继为双亲的右子树上按后序遍历列出的第一个结点。 

相关文章:

  • 突如其来的第一个1024要笑着过
  • 2022年都快结束了,Java的这些新技术、热门技术,你不会还不知道吧?
  • 【Linux】Linux文件权限的理解
  • 力扣(LeetCode)2008. 出租车的最大盈利(C语言)
  • 【正点原子I.MX6U-MINI应用篇】5、嵌入式Linux在LCD上显示BMP、JPG、PNG图片
  • 四非到保研厦大,我们还有多少路要走----技术人的保研之路
  • 美团Leaf分布式ID源码启动部署
  • 归一化小程序
  • 走过岁月我才发现——云IDE真方便(Python3.8环境测试)
  • SpringBoot核心技术 之 基础入门
  • Linux下编译工具:gcc/g++ の最全使用教程
  • 【计算机视觉】imutils的基本使用
  • Vue--nextTick--作用/用法/原理
  • 自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
  • 计算机网络习题答案
  • 【剑指offer】让抽象问题具体化
  • angular2开源库收集
  • ES学习笔记(12)--Symbol
  • iOS | NSProxy
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • overflow: hidden IE7无效
  • Spark学习笔记之相关记录
  • vue总结
  • 阿里研究院入选中国企业智库系统影响力榜
  • 百度小程序遇到的问题
  • 对超线程几个不同角度的解释
  • 翻译:Hystrix - How To Use
  • 聚类分析——Kmeans
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 微信小程序--------语音识别(前端自己也能玩)
  • 优化 Vue 项目编译文件大小
  • 怎么将电脑中的声音录制成WAV格式
  • 数据可视化之下发图实践
  • ​iOS实时查看App运行日志
  • ###项目技术发展史
  • $.ajax()方法详解
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (06)Hive——正则表达式
  • (3)nginx 配置(nginx.conf)
  • (4)logging(日志模块)
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (一)Linux+Windows下安装ffmpeg
  • (一)基于IDEA的JAVA基础10
  • (转)平衡树
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .net下简单快捷的数值高低位切换