2024王道408数据结构P144 T16

2024王道408数据结构P144 T16

思考过程

  1. 首先看题目,要求我们把二叉树的叶子结点求出来并且用链表的方式存储,链接时用叶结点的右指针来存放单链表指针。我们很清楚可以看出来能用中序遍历+递归的方式实现,因为第一个叶子结点在整棵树的最左下角。
  2. 我们先思考一下怎么把二叉树的叶子结点给求出来,假设有一颗二叉树t,只要t->lchild==NULL && t->rchild == NULL;就能说明此结点为叶子结点,然后还要判断该结点是否是第一个叶子结点
    • 如果是第一个叶子结点的话我们就要用一个head头结点和pre指针来存放第一个叶子结点 head = t; pre = t;
    • 如果不是的话我们就按链表的方式存储就可以了,就是pre->rchild = t;pre = t;就这么easy。

举个例子

  1. 首先请出我们的老演员二叉树我们需要一个头结点head和指针prestruct TreeNode* head = (struct TreeNode*)sizeof(struct TreeNode), *pre = NULL;pre指针我们就先赋值NULL。
  2. 然后我们直接开始递归到最左边的结点也就是结点D,Inorder(t->lchild);因为是中序遍历,先访问左子树。访问到D之后判断该结点是叶子结点,此时D是第一个叶子结点,所以把head和pre都赋值为D 然后我们都第一个叶子结点就成功加入到链表当中了。
  3. 然后代码回溯到结点B,再去找B到右子树E。当找到E时判断该结点是否是第一个叶子结点,发现不是第一个结点所以我们就可以直接把它加入进链表当中
    让代码一直按中序遍历递归下去,这样题目就写完啦。

完整代码

cpp 复制代码
//
// Created by 黎圣  on 2023/8/25.
//
#include "iostream"
typedef struct TreeNode
{
    char data;
    struct TreeNode *lchild, *rchild;
}*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;
        CreateTree(t->lchild);
        CreateTree(t->rchild);
    }
}
struct TreeNode *pre = NULL, *head = (struct TreeNode*)malloc(sizeof(struct TreeNode));
tree Inorder(tree &t)
{
    if (t)
    {
        Inorder(t->lchild);
        if (t->lchild == NULL && t->rchild == NULL)
        {
            //是否是第一个
            //是
            if (pre == NULL)
            {
                head = t;
                pre = t;
            }
            //不是第一个
            else
            {
                pre->rchild = t;
                pre = t;
            }
        }
        Inorder(t->rchild);
    }
    return head;
}
int main()
{
    tree t;
    CreateTree(t);
    //ABD##E##CF##G##
    Inorder(t);
    while (head)
    {
        printf("%c ", head->data);
        head = head->rchild;
    }
    return 0;
}

最后感谢b站up主@吸血小金鱼

相关推荐
小星星闪亮登场7 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
冻柠檬飞冰走茶7 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
2501_942389558 小时前
Epoch AI旗下FrontierMath的负责人Elliot Glazer
数据结构·决策树·动态规划·散列表
shylyly_9 小时前
104.二叉树的最大深度
数据结构·算法·104.二叉树的最大深度
白白白小纯13 小时前
每日算法day3—回文链表,链表分割
c语言·数据结构·算法·leetcode
zander25815 小时前
35. 搜索插入位置:从边界语义理解二分查找
数据结构·算法·leetcode
Chen—LSN15 小时前
C语言——深度理解指针(5)
c语言·数据结构·算法·排序算法
佳児素花痴╮17 小时前
树的基础知识与查找排序算法
数据结构·算法
郝学胜-神的一滴18 小时前
Python 高级编程 026:内置数据结构之骈文纵论
开发语言·数据结构·python·程序人生·软件工程
程序员老舅1 天前
啃透 I2C 驱动开发,才算入门嵌入式 Linux 内核驱动
数据结构·驱动开发·b树·内核·嵌入式·嵌入式开发·i2c