中序线索化二叉树及遍历

2023-11-15

中序线索化二叉树及遍历。
函数接口定义

void InThreading(BiThrTree p);// 以结点P为根的子树中序线索化
void InOrderTraverse_Thr(BiThrTree T);// 中序遍历二叉线索树T的非递归算法,对每个数据元素直接输出

裁判测试程序样例:

#include<iostream>
using namespace std;

typedef struct BiThrNode
{				
	char data;						
	struct BiThrNode *lchild,*rchild;
	int LTag,RTag;
}BiThrNode,*BiThrTree;


BiThrNode *pre=new BiThrNode;

void CreateBiTree(BiThrTree &T)
{	
	char ch;
	cin >> ch;
	if(ch=='#')  T=NULL;			
	else
	{							
		T=new BiThrNode;
		T->data=ch;					
		CreateBiTree(T->lchild);
		CreateBiTree(T->rchild);	
	}								
}								

void InThreading(BiThrTree p);
void InOrderTraverse_Thr(BiThrTree T);

int main()
{
	pre->RTag=1;
	pre->rchild=NULL;
	BiThrTree tree;
	CreateBiTree(tree);
	InThreading(tree);
	InOrderTraverse_Thr(tree);
	return 0;
}
/* 请在这里填写答案 */

输入样例:

ABD###CEG###FH##I##

输出样例:

DBAGECHFI

分析:从裁判样例入手

  1. 先序遍历建树
void CreateBiTree(BiThrTree &T)
{
    char ch;
    cin >> ch;
    if(ch=='#')
        T=NULL;
    else
    {
        T=new BiThrNode;
        T->data=ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
}
  1. 建立中序线索,赋予前驱和后继的值
void InThreading(BiThrTree root)/* 对root所指的二叉树进行中序线索化,其中pre始终指向刚访问过的结点,其初值为NULL*/
{
    if (root!=NULL)
    {
        InThreading(root->lchild);  /* 线索化左子树 */
        if (root->lchild==NULL)/*没有左孩子指向前驱*/
        {
            root->LTag=1;
            root->lchild=pre->rchild;  /*置前驱线索 */
            /*主函数是对pre->rchild=NULL,赋值为空。第一个结点的前驱为空,此时要把pre->rchild赋给root->lchild,而不是把pre赋给root->lchild*/
        }
        if (pre!=NULL&&pre->rchild==NULL)  /* 置后继线索 */
        {
            pre->rchild=root;
            pre->RTag=1;
        }
        pre=root;
        InThreading(root->rchild);  /*线索化右子树*/
    }
}
  1. 找到中序遍历的第一个结点,并不断找后继,此时输出的就是中序遍历
BiThrNode * InNext(BiThrNode *p)
/*在中序线索二叉树中查找p的中序后继结点,并用next指针返回结果*/
{
    BiThrNode *Next;
    BiThrNode *q;
    if (p->RTag==1)
        Next=p->rchild;  /*直接利用线索*/
    else
    {
        /*在p的右子树中查找"最左下端"结点*/
        if(p->rchild!=NULL)
        {
            for(q=p->rchild; q->LTag==0 ; q=q->lchild);
            Next=q;
        }
        else
            Next = NULL;
    }
    return Next;
}
BiThrNode* TinFirst(BiThrTree root)
{
    BiThrNode *q=root;
    q=root;
    if(q)
        while(q->lchild!=NULL)/*找左子树的左子树。。。*/
            q=q->lchild;
    return q;
}
void InOrderTraverse_Thr(BiThrTree root)
{
    BiThrNode *p;
    p=TinFirst(root);/*找到第一个结点*/
    while(p!=NULL)
    {
        printf("%c",p->data);
        p=InNext(p);
    }
}

完整代码

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
typedef struct BiThrNode
{
    char data;
    struct BiThrNode *lchild,*rchild;
    int LTag,RTag;
} BiThrNode,*BiThrTree;
BiThrNode *pre=new BiThrNode;
void CreateBiTree(BiThrTree &T)
{
    char ch;
    cin >> ch;
    if(ch=='#')
        T=NULL;
    else
    {
        T=new BiThrNode;
        T->data=ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
}
void InThreading(BiThrTree root)/* 对root所指的二叉树进行中序线索化,其中pre始终指向刚访问过的结点,其初值为NULL*/
{
    if (root!=NULL)
    {
        InThreading(root->lchild);  /* 线索化左子树 */
        if (root->lchild==NULL)/*没有左孩子指向前驱*/
        {
            root->LTag=1;
            root->lchild=pre->rchild;  /*置前驱线索 */
        }
        if (pre!=NULL&&pre->rchild==NULL)  /* 置后继线索 */
        {
            pre->rchild=root;
            pre->RTag=1;
        }
        pre=root;
        InThreading(root->rchild);  /*线索化右子树*/
    }
}
BiThrNode * InNext(BiThrNode *p)
/*在中序线索二叉树中查找p的中序后继结点,并用next指针返回结果*/
{
    BiThrNode *Next;
    BiThrNode *q;
    if (p->RTag==1)
        Next=p->rchild;  /*直接利用线索*/
    else
    {
        /*在p的右子树中查找"最左下端"结点*/
        if(p->rchild!=NULL)
        {
            for(q=p->rchild; q->LTag==0 ; q=q->lchild);
            Next=q;
        }
        else
            Next = NULL;
    }
    return Next;
}
BiThrNode* TinFirst(BiThrTree root)
{
    BiThrNode *q=root;
    q=root;
    if(q)
        while(q->lchild!=NULL)/*找左子树的左子树。。。*/
            q=q->lchild;
    return q;
}
void InOrderTraverse_Thr(BiThrTree root)
{
    BiThrNode *p;
    p=TinFirst(root);/*找到第一个结点*/
    while(p!=NULL)
    {
        printf("%c",p->data);
        p=InNext(p);
    }
}
int main()
{
    pre->RTag=1;
    pre->rchild=NULL;
    BiThrTree tree;
    CreateBiTree(tree);
    InThreading(tree);
    InOrderTraverse_Thr(tree);
    return 0;
}

若在主函数初始化pre为NULL,则建立中序线索二叉树时

void  Inthread(BiTree root)/* 对root所指的二叉树进行中序线索化,其中pre始终指向刚访问过的结点,其初值为NULL*/
{
    if (root!=NULL)
    {
        Inthread(root->LChild);  /* 线索化左子树 */
        if (root->LChild==NULL)/*没有左孩子指向前驱*/
        {
            root->Ltag=1;
            root->LChild=pre;  /*置前驱线索*/
            /*第一个结点没有前驱,则直接把pre赋值给root->LChild*/
        }
        if (pre!=NULL&& pre->RChild==NULL)  /* 置后继线索 */
        {
            pre->RChild=root;
            pre->Rtag=1;
        }
        pre=root;
        Inthread(root->RChild);  /*线索化右子树*/
    }
}

完整代码

#include <stdio.h>
#include <malloc.h>
#include <conio.h>
typedef char DataType;
typedef struct Node
{
    DataType data;
    int  Ltag;
    int  Rtag;
    struct Node *LChild;
    struct Node *RChild;
} BiTNode, *BiTree;
BiTree pre;
void CreateBiTree(BiTree *bt)/*先序遍历建立二叉树*/
{
    char ch;
    ch = getchar();
    if(ch=='#')
        *bt=NULL;
    else
    {
        *bt=(BiTree)malloc(sizeof(BiTNode)); //生成一个新结点
        (*bt)->data=ch;
        (*bt)->Ltag=0;/*相当于初始化*/
        (*bt)->Rtag=0;
        CreateBiTree(&((*bt)->LChild)); //生成左子树
        CreateBiTree(&((*bt)->RChild)); //生成右子树
    }
}
void  Inthread(BiTree root)/* 对root所指的二叉树进行中序线索化,其中pre始终指向刚访问过的结点,其初值为NULL*/
{
    if (root!=NULL)
    {
        Inthread(root->LChild);  /* 线索化左子树 */
        if (root->LChild==NULL)/*没有左孩子指向前驱*/
        {
            root->Ltag=1;
            root->LChild=pre;  /*置前驱线索 */
        }
        if (pre!=NULL&& pre->RChild==NULL)  /* 置后继线索 */
        {
            pre->RChild=root;
            pre->Rtag=1;
        }
        pre=root;
        Inthread(root->RChild);  /*线索化右子树*/
    }
}
BiTNode * InNext(BiTNode * p)
/*在中序线索二叉树中查找p的中序后继结点,并用next指针返回结果*/
{
    BiTNode *Next;
    BiTNode *q;
    if (p->Rtag==1)
        Next = p->RChild;  /*直接利用线索*/
    else
    {
        /*在p的右子树中查找"最左下端"结点*/
        if(p->RChild!=NULL)
        {
            for(q=p->RChild; q->Ltag==0 ; q=q->LChild);
            Next=q;
        }
        else
            Next = NULL;
    }
    return(Next);
}
BiTNode* TinFirst(BiTree root)
{
    BiTNode *p;
    p = root;
    if(p)
        while(p->LChild!=NULL)
            p=p->LChild;
    return p;
}
void TinOrder(BiTree root)
{
    BiTNode *p;
    p=TinFirst(root);
    while(p!=NULL)
    {
        printf("%c",p->data);
        p=InNext(p);
    }
}
int main()
{
    BiTree T;
    BiTree p,q;
    CreateBiTree(&T);
    pre=NULL;
    Inthread(T);
    TinOrder(T);
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

中序线索化二叉树及遍历 的相关文章

随机推荐

  • Burp Suite配置代理

    1 打开burp工具后按照下图的步骤 2 点开Add后如下弹窗 输入端口号和地址后点击ok即可
  • 正则表达式基础语法大全

    正则表达式基础语法 1 普通字符 字母 数字 汉子 下划线 以及没有特殊定义的标点符号 都是 普通字符 表达式中的普通字符 在匹配一个字符串的时候 匹配与之相同的一个字符 2 简单的转义字符 3 标准字符集合 能够与 多种字符 匹配的表达式
  • 查看oracle数据库防火墙设置,用三个方法设置Oracle数据库穿越防火墙

    用三个方法设置Oracle数据库穿越防火墙 方法一 在系统注册表中 hkey local machinesoftwareoraclehome0下加入字符串值 USE SHARED SOCKET TRUE 方法二 1 首先 我们需要将数据库实
  • x264中open_file_yuv函数欣赏(顺便谈谈如何利用指针在被调函数中改变主调函数中变量的值)

    先来看一个结构体yuv input t typedef struct FILE fh int width height int next frame yuv input t yuv input t结构体用fh这个文件指针打开原始的yuv文件
  • 超详细的VSCode下载和安装教程(非常详细)从零基础入门到精通,看完这一篇就够了。

    文章目录 1 引言 2 下载VSCode 3 解决VSCode下载速度特别慢 4 安装VSCode 1 引言 今天用WebStorm运行前端代码时 发现不太好打断点 于是 打算改用VSCode来运行前端代码 但前提是要安装VSCode 如下
  • c,c++小白到大神系列教程之一:C语言入门-王健伟-专题视频课程

    c c 小白到大神系列教程之一 C语言入门 1127人已学习 课程介绍 本课程针对 有一点计算机基础比如知道二进制 八进制 十六进制数据的含义 对内存 堆 栈等有基本概念的计算机初学者 全面介绍C语言精华内容以及利用C语言进行程序设计的方法
  • 三角脉冲信号的表达式_【信号处理工具箱】—信号表示方法

    1 工具箱中常见的函数 1 sawtooth函数 sawtooth函数用于产生锯齿波或三角波信号 格式如下 t 0 0 0001 1 y sawtooth 2 pi 50 t subplot 211 plot t y axis 0 0 2
  • 用java做一个超级马里奥的小游戏

    好的 首先你需要准备一些基本的知识和工具 了解 Java 语言的基本语法和编程概念 安装好 Java 开发环境 比如 Eclipse 或者 IntelliJ IDEA 准备好一些图像和音频资源 用于游戏中的背景 角色 音效等元素 接下来 你
  • wazuh 收集 suricata eve.json日志

    安装suricata和规则 源码或者安装包 本博客提供安装包操作方式 切换成超级用户进行操作 yum y install epel release wget jq curl O https copr fedorainfracloud org
  • 2013豆瓣校园招聘研发类笔试题

    2013豆瓣校园招聘研发类笔试题 1 将一个递归算法改为对应的非递归算法时 通常需要使用 A 优先队列 B 队列 C 循环队列 D 栈 2 爸爸 妈妈 妹妹 小强 至少两个人同一生肖的概率是多少 A 41 96 B 55 96 C 72 1
  • qqkey获取原理_通过call获取qqkey支持最新版

    如果真 进程 是否存在 TIM exe 假 且 进程 是否存在 QQ exe 假 str 你还没有登录QQ 返回 0 如果真结束 如果真 进程 是否存在 QQ exe pid 进程 取同名ID QQ exe pids 计次循环首 pid i
  • python Web开发 flask轻量级Web框架

    O flask介绍 Flask是一个使用 Python 编写的轻量级 Web 应用框架 其 WSGI 工具箱采用 Werkzeug 模板引擎则使用 Jinja2 Flask使用 BSD 授权 Flask也被称为 microframework
  • 数据结构题目-稀疏矩阵

    目录 问题 AU 函数可变参数练习 附加代码模式 问题 AV 多维下标向一维下标的换算 问题 AW 稀疏矩阵类型判断 问题 AX 稀疏矩阵转换成简记形式 附加代码模式 问题 AY 根据三元组输出稀疏矩阵 问题 AZ 三元组法表示的稀疏矩阵
  • python3.7解决ModuleNotFoundError: No module named '_bz2'

    安装完python3 7之后运行一个软件提示错误 from bz2 import BZ2Compressor BZ2Decompressor ModuleNotFoundError No module named bz2 解决方法如下 一
  • Linux内存管理子系统

    1 Linux子系统 Linux内核组成 SCI系统调用接口 PM进程管理子系统 MM内存管理子系统 Arch体系结构相关代码 DD驱动程序 Network Stack网络协议站 VFS虚拟文件系统 DD驱动程序 2 Linux内存管理子系
  • 《Apache MINA 2.0 用户指南》第十二章:日志过滤器

    后台 用户开放基于Apache MiNa的应用程序 用户可以在应用程序中创建日志管理 SLF4J MINa采用SLF4j作为日志输出 你可以在这里发现很多关于SLF4j的相关介绍 这个日志工具允许任何形式的日志系统实施 你可能使用 log4
  • 手把手教你使用gtest写单元测试

    开源框架 gtest 它主要用于写单元测试 检查真自己的程序是否符合预期行为 这不是QA 测试工程师 才学的 也是每个优秀后端开发codoer的必备技能 本期博文内容及使用的demo 参考 Googletest Basic Guide 1
  • 设计模式——多线程下的懒汉式单例

    懒汉 模式虽然有优点 但是每次调用 GetInstance 静态方法时 必须判断NULL m instance 使程序相对开销增大 多线程中会导致多个实例的产生 从而导致运行代码不正确以及内存的泄露 对于多线程的问题 我们可以看下面这个例子
  • 手把手教你用MindSpore训练一个AI模型!

    首先我们要先了解深度学习的概念和AI计算框架的角色 https zhuanlan zhihu com p 463019160 本篇文章将演示怎么利用MindSpore来训练一个AI模型 和上一章的场景一致 我们要训练的模型是用来对手写数字图
  • 中序线索化二叉树及遍历

    中序线索化二叉树及遍历 函数接口定义 void InThreading BiThrTree p 以结点P为根的子树中序线索化 void InOrderTraverse Thr BiThrTree T 中序遍历二叉线索树T的非递归算法 对每个