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;
}
相关推荐
Navigator_Z4 分钟前
LeetCode //C - 1283. Find the Smallest Divisor Given a Threshold
c语言·算法·leetcode
by2099923 分钟前
list:迭代器与资源管理实现的综合叙述(下)
数据结构·c++·笔记·list
啦啦啦啦啦zzzz34 分钟前
一致性哈希
服务器·算法·哈希算法·c++20·分布式存储
我不会起名字32238 分钟前
二叉树的遍历与二叉搜索树:把递归、迭代、还原树一次讲透
数据结构·leetcode·二叉树·二叉搜索树
垆边人似月.1 小时前
嵌入式传感器寄存器数据解析
算法
Tingmanyi1 小时前
YOLOv13改进策略【卷积层篇】| RFAConv 感受野注意力卷积,每个位置都值得被单独加权
深度学习·算法·yolo·目标检测·计算机视觉
yi0111 小时前
Leetcode 49 用 “身份证‘‘巧解
人工智能·笔记·python·算法·leetcode·哈希表
liuchangng2 小时前
类Jev项目Kev从入门到实战(7):如何选型:决策树与 checklist
算法·决策树·机器学习
yi0112 小时前
DAY22: LeetCode 733:图像渲染——从二维网格开始理解 DFS 和 BFS
数据结构·笔记·python·算法·leetcode·深度优先·宽度优先
Pniubi2 小时前
力扣41缺失的第一个正数(哈希表法)
算法·leetcode·职场和发展