重建二叉树

二叉树的重建 在http://blog.youkuaiyun.com/hacker_zhidian/article/details/60586445这篇文章中我们看了一下二叉树的四种遍历方式,接下来我们看一下关于二叉树的重建问题,什么叫二叉树的重建呢?比方说给你一棵二叉树的前序遍历顺序和中序遍历顺序,要求你求出这颗二叉树的后序遍历顺序。来看一下个具体的例题数据,给定一个二叉树的信息:二叉树节点数: 5 前序遍历顺序:1 2 阅读详情

题目:
  输入某二叉树的前序遍历和中序遍历,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含有重复的数字。
  例如,前序遍历序列:{1,2,3,7,3,5,6,8}
   中序遍历序列:{4,7,2,1,5,3,8,6}

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

typedef struct bTreenode{
    struct bTreenode *lchild;
    struct bTreenode *rchild;
    int    data;
}bTreenode;


void Print(bTreenode *head)
{
    bTreenode *p = head;
    if(p != NULL){
        printf("%d ",p->data);
        Print(p->lchild);
        Print(p->rchild);
    }
}

bTreenode * create(void)
{
    bTreenode *node = (bTreenode *)malloc(sizeof(bTreenode));
    if(NULL == node){
        printf("malloc fail\n");
        return NULL;
    }

    node->data = 0;
    node->rchild = NULL;
    node->lchild = NULL;
    return node;
}

bTreenode *dowork(int *prestart, int *preend,
                  int *midstart, int *midend)
{
   /*
     pre     1   2   4   7   3   5   6  8


    mid      4   7   2   1   5   3   8  6
    */

    // 1.从pre中找出root,创建root节点
    int  root_value = prestart[0];   //把root的值保存

    bTreenode *root = create();      //创建节点并赋值
    root->data = root_value;

    if(prestart == preend && midstart == midend)  //递归终止条件
        return root;

    //2.然后在mid中找到root,给予标记,来区分左子树和右子树
    int *rootindex = midstart;
    while(*rootindex != root_value && rootindex <midend)   //寻找mid中的root的位置
        rootindex++;

    int leftlength = rootindex - midstart;   //左子树的长度
    int *leftend   = prestart + leftlength;  //左子树的末尾位置

    // 3.把左右子树进行递归返回给root的左右孩子
    if(leftlength > 0){                       //leftchild
        root->lchild = dowork(prestart+1,leftend, midstart, rootindex-1);
    }
    if(leftlength < preend - prestart){       //rightchild
        root->rchild = dowork(leftend + 1, preend, rootindex+1, midend);
    }

    return root;
}


bTreenode *reBuild(int *pre, int *mid, int len)
{
    if(pre == NULL || mid == NULL || len < 1)
        return NULL;

   //执行函数
    bTreenode *node = dowork(pre , pre+len-1, mid, mid+len-1);
    return node;
}

void Free(bTreenode * root)
{
    if(root == NULL)
        return ;

    if(root->lchild)
        Free(root->lchild);
    if(root->rchild)
        Free(root->rchild);

    printf("free: %d\n",root->data);
    free(root);

}

int main()
{
    int pre[8] = {1,2,4,7,3,5,6,8};
    int mid[8] = {4,7,2,1,5,3,8,6};
    bTreenode *head = NULL;
    int len = sizeof(pre) / sizeof(int);

    head = reBuild(pre, mid, len);
    Print(head);
    printf("\n");

    Free(head);
    return 0;
}

执行结果:

这里写图片描述

NYOJ--重建二叉树 二叉树遍历,先序和中序重建二叉树,后序和中序重建二叉树等 阅读详情

相关推荐

CosyVoice 本地部署详细教程 手把手小白教程

本文提供了详细的CosyVoice本地部署教程,强调了避免中文名称和空格的重要性,并列出了必要的软件安装步骤,包括CUDA、cuDNN、Git和Miniconda。教程涵盖了从检查CUDA版本到下载模型和运行模型的全过程,确保用户能够顺利部署并使用CosyVoice。

huazn612的博客 2万+

【LeetCode】剑指 Offer 07. 重建二叉树 - Go 语言题解

本文给出了LeetCode中题目“剑指 Offer 07. 重建二叉树”的Go语言题解

weixin_44211968的博客 608

Bladed风电仿真软件新手必看:从界面操作到功率曲线计算的完整指南

本文为风电工程师提供Bladed仿真软件的完整入门指南,涵盖界面操作、功率曲线计算及动态仿真等核心功能。通过实战技巧和常见问题解决方案,帮助新手快速掌握这款全球领先的风电机组仿真工具,提升风电项目开发效率。

weixin_30839881的博客 101

GO语言实现二叉树基本功能

用go语言和递归算法完成二叉树的遍历、求结点数、求深度等操作。

g2020161853的博客 480

海康工业相机SDK+OpenCV实战:图像采集与Mat格式转换优化指南

本文深入探讨了如何高效利用海康工业相机SDK与OpenCV进行图像采集与处理。重点解析了从相机RawData到OpenCV Mat格式转换的核心优化技巧,包括像素格式匹配、内存零拷贝管理以及彩色图像BGR/RGB转换,旨在解决工业应用中常见的性能瓶颈与内存问题,构建稳定高效的图像处理流程。

weixin_29192211的博客 108

学习心得——COMSOL Multiphysics with MATLAB联合仿真及寻优计算

学习心得——COMSOL Multiphysics with MATLAB联合仿真及寻优计算

weixin_41678956的博客 8657

重建二叉树(Golang)《剑指offer》

题目描述: 输入某个二叉树的前序遍历和中序遍历的结果,请重建该二叉树。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如:输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建如图所示的二叉树并输出它的头节点。 主要代码如下: type BinaryTreeNode struct { Value int LeftNode...

象牙塔下的渣渣 669

Selenium ChromeDriver反爬与性能优化实战指南

ChromeDriver作为Selenium的核心驱动,本质是浏览器自动化执行引擎,其默认行为会暴露大量JS运行时指纹(如navigator.webdriver、window.chrome),极易被前端反爬系统识别;同时因进程管理粗放、渲染等待机制僵化,导致内存泄漏、僵尸进程和高并发下稳定性崩塌。本文围绕真实生产场景,系统解析浏览器指纹伪造原理、进程级资源管控策略、基于页面状态的智能等待范式,并提供Docker容器化、K8s弹性扩缩与Prometheus可观测性落地路径,助力开发者将ChromeDriver

weixin_29762151的博客 1259

Go语言实现:【剑指offer】重建二叉树

该题目来源于牛客网《剑指offer》专题。 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 Go语言实现: type TreeNode struct { Val int Left *TreeN...

golang 相关内容分享 434

域格4G网优模块获取

1、获取当前小区信息 接口说明 该命令用于获取当前小区信息。 语法结构 命令类型 格式 返回结果 Execute AT+SCELLINFO +SCELLINFO: <cellMode>,<mcc>,<mnc>,<lac>,<cellId>,<afrcn>,<cpi>,<rxLevel>

自由的幻想 2463

里海NX二次开发3000例-专栏目录

UDO(User Defined Object)是“用户自定义对象”。应用非常广,可以用UDO创建自定义特征,也可以对NX原有的特征添加一些特殊信息,这些信息会保存在部件中,以后可以查询。还可以实时追踪NX对象,例如做3D包容盒线框自动追踪实体,做2D矩形框自动追踪图纸尺寸值,这些在下面的例子都有介绍。读者可以自己编译下面的例子,体会理解UDO的用法。------里海 20230512序号内容​链接01使用UDO在所有实体上设置更新回调​链接02使用UDO生成跟踪实体的线框​链接03删除UDO​链接。

王牌飞行员_里海的博客 7711

剑指 Offer 07. 重建二叉树 - Golang

题目 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 三种遍历方式 前序:又称先序,输出 /输入顺序是先输出根结点的数据,再访问该结点的左子树以及右子树。 .

十安辰的博客 383

2026基金本子新规必看!聚焦四大底层问题,利用AI辅助分别破解提升中标率

我拟申报的研究主题为【明确的研究主题或关键词组合】。选题方向也是评审专家关注的核心之一,申报前可以检索近五年领域前人中标项目,分析现有研究的空白与不足,并结合自身研究基础选择 “人无我有、人有我优” 的细分方向,如果是交叉学科选题,则要阐述不同学科的融合逻辑与创新点。“推动国家战略”、“带来行业发展”等宏观表述,有很多同仁都喜欢用这类话术开篇,但实际上宏大叙事无法替代具体的真实科学问题,明确不了研究要解决的核心痛点,更没有说明问题的现实针对性,评审看了往往抓不到研究的核心价值。

智能AI让学术科研更容易 294

【算法专题】重建二叉树

重建二叉树总结 概述 重建二叉树分为三种类型: (1)中序遍历+前序遍历/后序遍历 重建二叉树; (2)中序遍历+层序遍历 重建二叉树; (3)前序遍历+给定叶节点 重建二叉树。 下面分别给出这三类重建二叉树的讲解。 类型一:中序+前序/后序 AcWing 1631. 后序遍历 问题描述 问题链接:AcWing 1631. 后序遍历 分析 对于给定前序遍历的区间[pl, pr]和中序遍历的区间[il, ir],则待构造的树的根节点为preorder[pl],

weixin_42638946的博客 5180

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

二叉树——重建二叉树

二叉树——重建二叉树 例如,某二叉树为: 前序遍历为:(4,7,9,2,1,5,6) 中序遍历为:(7,9,4,1,2,6,5) 后序遍历为:(9,7,1,6,5,2,4) 1.前序遍历+中序遍历 =&amp;gt; 重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 代码 #include &amp;lt;iostream&amp;gt; #in...

hh66__66hh的博客 3800

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

二叉树重建

二叉树重建系列二叉树重建根据不同遍历的序列重建根据数组或者链表重建 二叉树重建 二叉树重建的关键思想是递归重建。 根据不同遍历的序列重建 从前序与中序遍历序列中重建二叉树(LeetCode 105) 题目描述: 分析:前序遍历是每次先遍历根节点,在遍历左子树和右子树。因此前序遍历序列的第一个元素就是根节点,然后递归建立左右子树。 代码: class Solution { public: TreeNode* generate(vector<int>& preorder,int

l_s_2020的博客 274

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

二叉树重建(根据后序中序重建二叉树)

1:根据二叉树的后续序列和中序序列可以确定唯一的二叉树; 2:二叉树遍历顺序       前序遍历;根节点-->左子树-->右子树;    中序遍历:左子树-->根节点-->右子树;    后序遍历:左子树-->右子树-->根节点; 下面重建二叉树之后再层序遍历 #include #include #include int post[31],in[31]; int m,ele

计科菜鸟的天地. 1553

由中根序列和后根序列重建二叉树_二叉树的重建

重建二叉树引言问题:现有二叉树的后序遍历序列与中序遍历序列,能否求原二叉树?答案是肯定的,并且前序与中序也可以得到原二叉树。本文就如何使用这两种序列组合如何重建二叉树进行讨论。首先,定义二叉树的遍历。二叉树的遍历对于一个二叉树的遍历,有以下原则:- 遇到一个根节点,先访问左节点,再访问右节点而前,后,中序遍历分别指根节点在访问左右节点之前,之间,之后。如何重建?那么根据二叉树遍历的定义,对一个最简...

weixin_39528366的博客 1054

重建二叉树 python_重建二叉树

题目:输入某二叉树的前序遍历黑夜中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历中都不包含重复的数字。例如输入前序遍历序列{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历 {4, 7, 2, 1, 5, 3, 8, 6},则重建出该二叉树。C#实现:publicclassBinaryTreeNode{intvalue;BinaryTreeNodeleft;Binar...

weixin_39908616的博客 74
上一篇: c++学习笔记--拷贝构造函数
下一篇: 将一串字符(hello world I am c_player)反转为(c_player am I world hello)
龘麤三思
博客等级 码龄10年 11粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值