首页 > 编程语言 >线索化二叉树的递归算法

线索化二叉树的递归算法

时间:2023-05-01 09:45:29浏览次数:33  
标签:lchild 结点 递归 ThreadNode 算法 二叉树 rchild NULL data

// 线索化二叉树的递归算法

#include <stdio.h>
#include <malloc.h>

typedef struct BiTNode
{
    int data;
    struct BiTNode *lchild, *rchild; // 存储二叉树的左孩子和右孩子
} BiTNode, *BiTree;

typedef struct ThreadNode
{
    int data;
    struct ThreadNode *lchild, *rchild;
    int ltag=0, rtag=0;
} ThreadNode, *ThreadTree;

void createTree(ThreadTree &T)
{
    T = (ThreadTree)malloc(sizeof(ThreadNode));
    T->data = 1;

    T->lchild = (ThreadNode *)malloc(sizeof(ThreadNode));
    T->lchild->data = 2;

    T->lchild->lchild = (ThreadNode *)malloc(sizeof(ThreadNode));
    T->lchild->lchild->data = 4;
    T->lchild->lchild->lchild = NULL;
    T->lchild->lchild->rchild = NULL;

    T->lchild->rchild = (ThreadNode *)malloc(sizeof(ThreadNode));
    T->lchild->rchild->data = 5;

    T->lchild->rchild->lchild = (ThreadNode *)malloc(sizeof(ThreadNode));
    T->lchild->rchild->lchild->data = 7;
    T->lchild->rchild->lchild->lchild = NULL;
    T->lchild->rchild->lchild->rchild = NULL;

    T->lchild->rchild->rchild = (ThreadNode *)malloc(sizeof(ThreadNode));
    T->lchild->rchild->rchild->data = 8;
    T->lchild->rchild->rchild->lchild = NULL;
    T->lchild->rchild->rchild->rchild = NULL;

    T->rchild = (ThreadNode *)malloc(sizeof(ThreadNode));
    T->rchild->data = 3;
    T->rchild->lchild = NULL;

    T->rchild->rchild = (ThreadNode *)malloc(sizeof(ThreadNode));
    T->rchild->rchild->data = 6;
    T->rchild->rchild->lchild = NULL;
    T->rchild->rchild->rchild = NULL;
}

void InThread(ThreadTree &p, ThreadTree &pre) // 中序遍历线索二叉树
{
    if (p != NULL)
    {
        InThread(p->lchild, pre); // 递归线索化左子树
        if (p->lchild == NULL)    // 如果p结点的左孩子为NULL,也就是一个空指针域
        {
            p->lchild = pre; // 将原本指向左孩子的指针指向中序遍历的前驱结点
            p->ltag = 1;     // ltag为0表示指向的是左孩子结点,ltag为1表示指向的是中序遍历的前驱结点
        }
        if (pre != NULL && pre->rchild == NULL) // 判断p的前驱结点是否为空,右孩子指针是否为空
        {
            pre->rchild = p; // 将p的前驱结点pre的右孩子指针指向p
            pre->rtag = 1;   // rtag为0表示指向的是右孩子结点,rtag为1表示指向的是中序遍历的后继结点
        }
        pre = p;                  // 进行下一个结点的线索化
        InThread(p->rchild, pre); // 因为是中序遍历线索化,所以先递归线索化左子树,中间线索化根节点,最后递归线索化右子树
    }
}

ThreadNode *Firstnode(ThreadNode *p)//求中序序列下的第一个结点
{
    while(p->ltag == 0)//判断是否有左孩子 没有左孩子最后返回
    {
        p=p->lchild;
    }
    return p;
}

ThreadNode *Nextnode(ThreadNode *p)//寻找结点p在中序遍历下的后继
{
    if(p->rtag == 0)//如果rtag是0 说明rchild连接的是右孩子,所以将其看做成一个右子树,查询该右子树的中序遍历的第一个结点,得到的就是p的后继
    {
        return Firstnode(p->rchild);
    }
    else
    {
        return p->rchild;//如果rtag是1,说明rchild连接的就是后继结点,直接返回即可
    }
}


int main()
{
    ThreadTree Tree;
    createTree(Tree);
    ThreadNode* pre=NULL;
    InThread(Tree,pre);
    // printf("%d\n",Tree->lchild->rchild->lchild->lchild->data);//求7的前驱结点

    printf("FirstNode: %d \n",Firstnode(Tree)->data);
    printf("Tree->lchild Nextnode: %d \n",Nextnode(Tree->lchild)->data);
    return 0;
}

 

标签:lchild,结点,递归,ThreadNode,算法,二叉树,rchild,NULL,data
From: https://www.cnblogs.com/ryuichi-ssk/p/17366182.html

相关文章

  • m分别使用meanshift和camshift两种算法实现人员跟踪并输出人员移动曲线matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:    2.算法涉及理论知识概要       meanshift算法其实通过名字就可以看到该算法的核心,mean(均值),shift(偏移),简单的说,也就是有一个点,它的周围有很多个点 我们计算点 移动到每个点 所需要的偏移量之和,求平均,就得到......
  • 文心一言 VS chatgpt (13)-- 算法导论3.1 8题 3.2 1题
    八、可以扩展我们的记号到有两个参数n和m的情形,其中的n和m可以按不同速率独立地趋于无穷。对于给定的函数g(n,m),用O(g(n,m))来表示以下函数集:O(g(n,m))={f(n,m):存在正常量c、和,使得对所有n>=n0或m>=m0,有0<=f(n,m)<=cg(n,m)}对Ω(g(n,m))和θ(g(n,m))给出相应的定义。文......
  • 文心一言 VS chatgpt (13)-- 算法导论3.1 8题 3.2 1题
    八、可以扩展我们的记号到有两个参数n和m的情形,其中的n和m可以按不同速率独立地趋于无穷。对于给定的函数g(n,m),用O(g(n,m))来表示以下函数集:O(g(n,m))=对Ω(g(n,m))和θ(g(n,m))给出相应的定义。文心一言:chatgpt:类比于单个参数的情形,我们可以定义类似的记号:O(g(n,......
  • 【通信仿真】基于matlab模拟自相干算法仿真
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • DeepMind:用 GNN 学习通用推理算法
    文|智商掉了一地小孩子才做选择,我的模型全!都!要!近年来,基于深度神经网络的机器学习系统取得了巨大进步,尤其是在以感知为主的任务上。这一领域表现突出的模型通常要在分布中进行泛化,意味着它们的训练和验证集代表了测试输入的预期分布。相比之下,要真正掌握由推理主导的任务,即使是在......
  • 抱抱脸:ChatGPT背后的算法——RLHF | 附12篇RLHF必刷论文
    文|卖萌酱大家好,我是卖萌酱。前几天,抱抱脸公司(HuggingFace)发表了一篇博客[1],详细讲解了ChatGPT背后的技术原理——RLHF。笔者读过之后,觉得讲解的还是蛮清晰的,因此提炼了一下核心脉络,希望给对ChatGPT技术原理感兴趣的小伙伴带来帮助。此外,文末整理了几篇关于RLHF最热门的12篇必......
  • 数据结构与算法复习--(2)
    算法和算法分析算法的定义对特定问题求解方法和步骤的一种描述,它是指令的有限序列。其中每个指令表示一个或多个操作。算法的描述自然语言:英语、中文流程图:传统流程图、NS流程图伪代码:类语言:类C语言程序代码:C语言程序、Java语言程序算法与程序算法是解决问题的一......
  • 加密算法整理
    加密技术通常分为两大类:“对称式”和“非对称式”。对称式加密:加密和解密使用同一个密钥,通常称之为“SessionKey”。如DES,它的SessionKey长度为56Bits。非对称式加密:加密和解密所使用的不是同一个密钥,通常有两个密钥,称为“公钥”和“私钥”。如RSA。[DES:密钥较短,加......
  • 算法入门
    算法介绍算法(Algorithm):⼀个计算过程,解决问题的⽅法NiklausWirth:“程序=数据结构+算法”时间复杂度简单总结时间复杂度是⽤来估计算法运⾏时间的⼀个式⼦(单位)。⼀般来说,时间复杂度⾼的算法⽐复杂度低的算法慢。常⻅的时间复杂度(按效率排序):O(1)<O(logn)<O(n)<O(nlo......
  • 分类预测 | MATLAB实现WOA-CNN鲸鱼算法优化卷积神经网络数据分类预测
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......