2024王道408数据结构P144 T18

2024王道408数据结构P144 T18

思考过程

  1. 首先还是先看题目的意思,让我们在中序线索二叉树里查找指定结点在后序的前驱结点,这题有一点难至少对我来说...我讲的不清楚理解一下我做的也有点糊涂。
  2. 在创建结构体时多两个变量ltag和rtag,当ltag=0时就说明该结点有左孩子,当ltag=1时说明该结点的lchild指向它的前驱结点
  3. 那么我们需要把一个二叉树给中序线索化,线索化后假设有这么一颗二叉树之后要查找指定结点在后序的前驱结点有这么五种情况,假设指定结点为指针p:
    • 如果p有右孩子,那么在后序的前驱结点也就是该结点的右孩子if(p->rtag==0)从上面那个二叉树来看很明显。
    • 如果p没有右孩子但是有左孩子,那么在后序的前驱结点也就是改结点的左孩子if(p->ltag==0)比如上图的结点B,当B没有右孩子但是有左孩子时,在后序序列中的前驱结点也就是它的左孩子D。
    • 如果p是中序遍历中的第一个结点的话,那么在后序遍历中也必定是第一个结点if (p->lchild==NULL)这时候也就说明该结点没有前驱结点,我们直接q=NULL就好了。
    • 第四种情况就是该结点没有左右孩子,比如下图这种情况这棵树中的C结点就是没有左右孩子的,此时它在后序序列中的前驱结点就是先要找到该结点的祖先, while (p->ltag == 1 && p->lchild != NULL) p = p->lchild;找到祖先后那也就是该祖先结点的左孩子。if (p->ltag == 0) q = p->lchild;
    • 那最后一种情况就是一棵树中既没有左孩子也没有右孩子,只有一个孤零零的结点,此时也就是q=NULL;

完整代码

cpp 复制代码
//
// Created by 黎圣  on 2023/8/29.
//
//在中序线索二叉树里查找指定结点在后序的前驱结点
#include "iostream"
using namespace std;
typedef struct TreeNode
{
    char data;
    struct TreeNode *lchild, *rchild;
    int ltag, rtag;
}*tree;
void CreateTree(tree &t)
{
    char ch = getchar();
    if (ch == '#')
        t = NULL;
    else
    {
        t = (struct TreeNode *)malloc(sizeof(struct TreeNode));
        t->data = ch;
        t->lchild = NULL;
        t->rchild = NULL;
        t->ltag = t->rtag = 0;
        CreateTree(t->lchild);
        CreateTree(t->rchild);
    }
}
struct TreeNode *pre;
void zx(tree &t)
{
    if (t)
    {
        zx(t->lchild);
        if (t->lchild == NULL)
        {
            t->ltag = 1;//无左孩子
            t->lchild = pre;
        }
        else
            t->ltag = 0;//有左孩子
        if (pre != NULL && pre->rchild == NULL)
        {
            pre->rtag = 1;
            pre->rchild = t;
        }
        pre = t;
        zx(t->rchild);
    }
}
tree Inpostpre(tree &t, struct TreeNode *p)
{
    struct TreeNode *q;//结果指针
    if (p->rtag == 0)//有右孩子就是右孩子
        q = p->rchild;
    else if (p->ltag == 0)//没有右孩子有左孩子就是左孩子
        q = p->lchild;
    else if (p->lchild == NULL)
        q = NULL;
    else
    {
        while (p->ltag == 1 && p->lchild != NULL)
            p = p->lchild;
        //若找到祖先结点 且有左孩子 结果就是左孩子
        if (p->ltag == 0)
            q = p->lchild;
        else
            q = NULL;
    }
    return q;
}
int main()
{
    tree t;
    CreateTree(t);
    //ABD##E##CF##G##
    zx(t);
    printf("%c ", Inpostpre(t, t->rchild)->data);
    return 0;
}
相关推荐
FMRbpm3 分钟前
栈练习--------有效的括号(LeetCode 20)
数据结构·c++·leetcode·新手入门
ReinaXue6 分钟前
快速认识图像生成算法:VAE、GAN 和 Diffusion Models
图像处理·人工智能·神经网络·算法·生成对抗网络·计算机视觉·语言模型
再睡一夏就好13 分钟前
进程调度毫秒之争:详解Linux O(1)调度与进程切换
linux·运维·服务器·c++·算法·哈希算法
无限进步_15 分钟前
C语言双向循环链表实现详解:哨兵位与循环结构
c语言·开发语言·数据结构·c++·后端·算法·链表
wljun73916 分钟前
五、OrcaSlicer 切片
算法·切片软件 orcaslicer
杨福瑞23 分钟前
数据结构:栈
c语言·开发语言·数据结构
罗湖老棍子27 分钟前
宠物小精灵之收服(信息学奥赛一本通- P1292)
算法·动态规划·01背包
LDG_AGI35 分钟前
【推荐系统】深度学习训练框架(十四):特征映射——Murmur哈希:高效“无状态”转换
人工智能·深度学习·算法·机器学习·哈希算法·推荐算法
Jing_Rainbow36 分钟前
【LeetCode Hot 100 刷题日记(22/100)】160. 相交链表——链表、双指针、哈希表📌
算法·面试·程序员
兩尛42 分钟前
HJ98 喜欢切数组的红(dp
算法