二叉树的建立

利用中根序列和后根序列重建二叉树 问题:已知二叉树的后根序列和中根序列,请构造此二叉树。  分析:对于提供了后根序列和中根序列的一棵二叉树,其结构信息是完备的。考虑后根序列a(1)->a(n),中根序列b(1)->b(n)。我们知道中根序列b(1)->b(n)包含一颗完整的二叉树,那么中根序列里面肯定有一个元素b(i)是该二叉树的根。而根据中根序列的定义,b(i)前面的元素构成的一个序列b(1)->b(i-1)是 阅读详情

已知非空的二叉树的先序序列和中序序列,建立这棵二叉树的二叉链表,输出后序序列并计算二叉树中左子树的结点个数。假设树的结点个数不超过26个。

输入格式:
输入共二行,分别给出非空的二叉树的先序序列和中序序列。

输出格式:
输出也是二行,第一行输出二叉树的后序序列,第二行输出二叉树中左子树的结点个数。

输入样例:
ABCDEGF
CBEGDFA
输出样例:
CGEFDBA
6

#include<stdio.h>
#include<stdlib.h>

typedef char TElemType;
typedef int Status;

#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define N 100
typedef struct BiTNode
{
    char data;
    struct BiTNode *lchild,*rchild;
} BiTNode,*BITree;

//
BiTNode* createBiTree(char *pre, char *in, int n)
{
    int n1 = 0,n2 = 0;
    int m1 = 0,m2 = 0;
    BiTNode* node = NULL;
    char lpre[100],rpre[100];//先序遍历左子树元素,右子树元素
    char lin[100],rin[100];//中序遍历左子树元素,右子树元素
    if (n == 0)//空树
    {
        return NULL;
    }
    node = (BiTNode*)malloc(sizeof(BiTNode));//根节点
    if (node==NULL)
    {
        return NULL;
    }

    node->data = pre[0];//先序序列的第一个元素必为根结点

    //根据根结点将中序序列分为左子树和右子数
    int i;
    for (i = 0; i<n; i++)
    {
        if ((i<=n1)&&(in[i]!=pre[0]))
        {
            lin[n1++] = in[i];
        }
        else if(in[i]!=pre[0])
        {
            rin[n2++] = in[i];
        }
    }
    //根据树的先序序列的长度等于中序序列的长度
    //且先序遍历是先左子树再后子树,无论先序还是中序 左子树和右子树的长度都是固定的
    //从i=1开始 因为先序遍历的第一个是根
    for (i = 1; i < n; i++)
    {
        if (i< (n1+1))//n1代表了左子树的长度
        {
            lpre[m1++] = pre[i];
        }
        else
        {
            rpre[m2++] = pre[i];
        }
    }
    node->lchild = createBiTree(lpre,lin,n1);
    node->rchild = createBiTree(rpre,rin,n2);

    return node;
}
Status PostOrder(BITree T)//后序遍历
{
    if(!T)
        return ERROR;
    else
    {
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        printf("%c",T->data);
        return OK;

    }

}

int NodeCount (BITree T)
{
    int nodes;
    if (T==NULL)
        return 0;
//    else if(T->lchild==NULL&&T->rchild==NULL)
//        nodes=1;

    else
        nodes=1+NodeCount(T->lchild)+NodeCount(T->rchild);
    return nodes;

}
int main()
{
    char preNode[N];//先序遍历存放
    char inNode[N];//中序遍历存放
    int n = 0;//树的长度
    char ch;
    BITree T;
    //printf("请输入先序序列\n");
    while((ch = getchar())&&ch!='\n')
        preNode[n++] = ch;
    //printf("请输入中序序列\n");
    n = 0;
    while((ch = getchar())&&ch!='\n')
        inNode[n++] = ch;
    T = createBiTree(preNode,inNode,n);//先序序列,中序序列,树的长度
    //printf("后序序列\n");
    PostOrder(T);
    //BITree T;
    printf("\n");
    printf("%d\n", NodeCount(T)-NodeCount(T->rchild)-1);//减去右子树结点和根节点

    return 0;
}

Week 3 Problem A 题目: 给定二叉树的中序和后序遍历,请编写程序创建该二叉树,计算其高度和先根序列,最后删除该二叉树;如给定的后序和中序遍历不合法,则亦能识别。注:二叉树采用二叉链表存储结构,创建二叉树后未删除者本题将不能获得满分。 输入格式: 输入为两行字符串,第一行表示某二叉树的后序遍历,第二行表示其中序遍历。结点值均为A-Z的大写字母,故二叉树结点不超过26,且保证输入的两个序列都是结点的全排列,但不一定是合... 阅读详情

相关推荐

二叉树的建立与遍历

【问题描述】 以二叉链表的形式创建二叉树(不超过20个结点),并编写二叉树的遍历算法,实现二叉树的三种遍历。 【输入形式】 输入二叉树的结点信息(以先序建立的方式)。 【输出形式】 输出二叉树的三种遍历序列。

AIGC 2607

7-11 重建二叉树 (10 分)(判读给出的数据是否合法)

7-11 重建二叉树 (10 分) 给定非空二叉树的中根序列和后根序列,请编写程序创建该二叉树,计算其高度和先根序列,最后删除该二叉树;如给定的中根和后根序列不合法,则亦能识别。 输入格式: 输入包含多组数据(不超过10组),每组为两行字符串,第一行表示某二叉树的后根序列,第二行表示其中根序列。结点的值均为A-Z的大写字母,故二叉树结点个数不超过26,且保证输入的两个序列都是结点的全排列,但不一定是合法的中根和后根序列。输入保证不是空二叉树。 输出格式: 对于每组数据,如果输入的序列不合法(不是同一棵树的中

weixin_53158895的博客 2168

【数据结构】建立二叉树、二叉树的推导技巧

逆向思维指的是反向思考问题的能力。而我们的二叉树的建立推导过程,就是运用了逆向思维。在得到的二叉树前序、中序、后序遍历的结果后,在根据2种不同的遍历结果,反向推导出二叉树集合。...

四季轮换叶,一路招摇胜 5405

7-10 重建二叉树 (10 分)

给定二叉树的中根序列和后根序列,请编写程序创建该二叉树,计算其高度和先根序列,最后删除该二叉树;如给定的中根和后根序列不合法,则亦能识别。 输入格式: 输入为两行字符串,第一行表示某二叉树的后根序列,第二行表示其中根序列。结点的值均为A-Z的大写字母,故二叉树结点个数不超过26,且保证输入的两个序列都是结点的全排列,但不一定是合法的中根和后根序列。 输出格式: 如果输入的序列不合法(不是同一棵树的中根序列和后根序列),则输出INVALID。若输入序列合法,输出为两行,第一行为一个整数,表示该二...

bibiobi的博客 2207

从科研小白到动物行为分析:我的DeepLabCut 3.0安装与初体验全记录

本文记录了从科研小白到成功安装并使用DeepLabCut 3.0进行动物行为分析的全过程。详细介绍了Anaconda环境配置、CUDA版本选择、DeepLabCut安装步骤及验证方法,并分享了初体验中的实用技巧和跨学科研究心得,为生物研究者提供了AI工具应用的实战指南。

weixin_30235225的博客 401

从寄存器到驱动:深入解读RFSoC RF-ADC阈值与校准API的底层逻辑

本文深入解析Xilinx RFSoC中RF-ADC的阈值检测与校准API的底层逻辑,涵盖寄存器映射、驱动实现及Gen3增强功能。通过详细代码示例和寄存器操作流程,揭示如何精准控制信号阈值检测与校准时序,提升系统稳定性与性能。特别探讨RF数据转换器在无线通信和雷达信号处理中的关键应用。

weixin_30552811的博客 687

已知某二叉树的前序遍历序列和中序遍历序列,生成一棵用二叉链表表示的二叉树,并打印出后续遍历序列的算法。

天津大学研究生院2015年招收硕士生入学试题算法设计题 由二叉树的前序遍历和中序遍历能确定唯一的一棵二叉树,用C语言或者C++实现由已知某二叉树的前序遍历序列和中序遍历序列,生成一棵用二叉链表表示的二叉树,并打印出后续遍历序列的算法。(算法要求有定义,且有主函数) 引用库函数 #include #include <stdio.h> #include <stdlib.h> #include <string.h> #include using namespace std

qq_42423354的博客 2346

python机器人编程——用python实现一个写字机器人

本篇我们构建一个可以跟人一样写字的机器人python软件。实现如下功能:打开一个写字板,人类在屏幕上写或画出任意形状,机器人同步在纸面上画出和人类一样的形状,就好像人类在远程操控机械臂,又或是机械臂是人的另一只手。这个软件是可以扩展的,如果连上互联网,可以实现人在北京写了一行字,在上海的机器臂同时也在自己的本子上写了一行字。

JAMES费的空间 7992

二叉树的建立与遍历详解

1、二叉树的建立与遍历分布详解 定义二叉树结构体: typedef struct BinaryTreeNode { TelemType data; struct BinaryTreeNode *Left; struct BinaryTreeNode *Right; }Node; 创建二叉树: Node* createBinaryTree() { Node ...

floating_fight的博客 6014

使用 CFD 仿真进行阀门性能分析:第一部分

了解如何使用 Ansys Discovery 评估阀门性能,使工程师能够设计出更好的产品。

jkh920184196的博客 3144

【超简单】一文入门在Ubuntu系统使用GitHub

Github是基于git的代码仓库,对于开发项目的科研者或者工程师,代码仓库都是不可多得的版本控制与多端编程工具,今天这篇文章带你轻松Github入门,简单的项目本文的操作足矣。

a13337649640的博客 5236

建立一个二叉树及遍历二叉树的步骤(C语言)

建立一个简单二叉树的基本步骤

qq_49175846的博客 1万+

边表法

边表法是用来绘制填充一个面的,边表法的关键是边表和连接边表的扫描线。 对于边的描述利用边表数据结构,包含边与扫描线的交点x坐标,边的最大y坐标,这样可以知道边加入到哪些扫描线上,便还有一个指针来记录扫描线上其它边。 //边数据结构 #pragma once #ifndef __CAETZ__ #define __CAETZ__ #include "pch.h" #include "CPoin...

weixin_42376458的博客 2101

python二叉树的建立和遍历

python二叉树 二叉树的建立: # -*- coding : utf-8 -*- class Node: def __init__(self,value=None,left=None,right=None): self.value = value self.left = left self.right = right if __name__ =='__main__': root...

Stupid-Tyro的博客 2281

自适应动态规划硕士博士论文学习

强化学习关注随机过程中的序贯决策问题,而自适应动态规划关注动态系统的控制问题。吸引域:系统渐近稳定的区域。

DarlingLSA的博客 1425

vue3+vite:引入tailwindcss不生效的原因,详细解决Tailwind配置没问题但就是不生效的情况,配置正确无报错但样式没有生效(包括tailwindcss在Vue2使用不生效解决方案)

vue3 tailwind使用教程以及tailwind不生效的问题,vue3+vite引入tailwindcss不生效的原因,tailwindcss配之后不生效怎么办,如何解决tailwinscss不生效的原因,Vue3项目使用tailwindcss在Vue2使用,不生效解决,如何解决使用 Tailwind CSS 后出现的样式不生效的问题?tailwindcss配之后不生效 tailwindcss不生效,为什么我的 Tailwind css 类没生效,解决使用 Tailwind 时样式不生效的问题,配置没

✅ 精选推荐文章 4127

用二叉链表建立二叉树

1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef struct node 4 { 5 int data; 6 struct node *l,*r; 7 8 }tree; 9 tree* Creattree(void)//层次建立二叉树 10 {...

dizp47129的博客 1846

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

线索二叉树建立

今天学习了线索二叉树的建立,于是走了一遍代码 #include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> using namespace std; /* 二叉树线索存储结构的定义 Link=0;代表指向左右孩子的指针 Thread=1, 代表指向前驱或者后继的...

Zyong139064359的博客 509

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

数据结构(二叉树)——二叉树的建立、存储、遍历

建立二叉树,并通过调用函数,,输出先序遍历、中序遍历与后序遍历的结果 #include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 //DataType 是二叉树数据元素类型,此程序定义为char型 typedef char DataType; typedef struct Node { Data

haha_7的博客 933

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C语言二叉树建立与遍历—实验报告

系别计算机学院班级学号姓名课程名称数据结构实验日期实验名称二叉树的建立与遍历算法应用成绩实验目的:熟悉掌握二叉链表存储结构及基本算法,并能应用二叉树的基本算法解决与之有关的简单问题,训练和提高结构化程序设计能力及程序调试能力。实验条件:计算机一台,Visual C++6.0或DEV C++判断一棵二叉树是否为满二叉树。要求二叉树用二叉链表存储,用先序、中序、后序递归遍历算法的任意两种输出二叉树中所有结点,编写程序判断该树是否为满二叉树。int val;// 结点的值。

冰小九的博客 2411

二叉树的建立及其递归遍历(C语言实现)

本文转载自二叉树的建立及其递归遍历(C语言实现) 最近在学习数据结构中树的概念,迟迟不得入门,应该是自己的懒惰和没有勤加练习导致的,以后应该多加练习 以下是我对二叉树的一些总结内容 二叉树的特点有: - 每一个节点最多有两棵子树,所以二叉树中不存在度大于2的节点,注意,是最多有两棵,没有也是可以的 左子树和右子树是有顺序的,次序不能颠倒,这点可以在哈夫曼编码中体现, 顺序不同编码方式不同...

zhc的博客 7282

二叉树建立的输入问题

这几天在看数据结构的二叉树,被二叉树建立时的输入问题困扰很久。二叉树的建立一般使用递归算法,将所有节点的数据一股脑的输入,递归无法停止,二叉树就无法建立。 感谢此博文,原来我们在输入节点数据的时候,必须输入空闲叶子节点,并用特殊符号标记,比如上述的博文的空闲叶子节点采用‘0’作为标记符,就能完整建立二叉树。 修改后的代码,亲测有效: #include&lt;iostream&gt; #in...

wudongming_000的博客 1万+

【算法导论】二叉树的建立

二叉树的建立 基本概念:         有序树与无序树:若将树中的每个节点的各个子树都看成是从左到右有次序的,则称该树为有序树,否则为无序数。         顺序存储:从根节点起,自上而下,从左至右的方式对节点进行顺序编号,编号即对应为要存储的数组的下标。于是节点与数组元素就一一对应了。         满二叉树、完全二叉树、非完全二叉树的区别:

青峰碧陋室 3641
上一篇: 子孙关系判断
下一篇: 计算后缀表达式的值
Asssshzy
博客等级 码龄7年 28粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值