博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试题6:重建二叉树(前序遍历和中序遍历)
阅读量:4922 次
发布时间:2019-06-11

本文共 1694 字,大约阅读时间需要 5 分钟。

题目描述

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

题目分析

剑指Offer(纪念版)P55

代码实现

分治与递归

BinaryTreeNode* Construct(int* preorder, int* inorder, int length){    if(preorder == NULL || inorder == NULL || length <= 0)        return NULL;    return ConstructCore(preorder, preorder + length - 1,        inorder, inorder + length - 1);}BinaryTreeNode* ConstructCore(    int* startPreorder, int* endPreorder,     int* startInorder, int* endInorder){    // 前序遍历序列的第一个数字是根结点的值    int rootValue = startPreorder[0];    BinaryTreeNode* root = new BinaryTreeNode();    root->m_nValue = rootValue;    root->m_pLeft = root->m_pRight = NULL;    if(startPreorder == endPreorder)    {        if(startInorder == endInorder && *startPreorder == *startInorder)            return root;        else            throw std::exception("Invalid input.");    }    // 在中序遍历中找到根结点的值    int* rootInorder = startInorder;    while(rootInorder <= endInorder && *rootInorder != rootValue)        ++ rootInorder;    if(rootInorder == endInorder && *rootInorder != rootValue)        throw std::exception("Invalid input.");    int leftLength = rootInorder - startInorder;    int* leftPreorderEnd = startPreorder + leftLength;    if(leftLength > 0)    {        // 构建左子树        root->m_pLeft = ConstructCore(startPreorder + 1, leftPreorderEnd,             startInorder, rootInorder - 1);    }    if(leftLength < endPreorder - startPreorder)    {        // 构建右子树        root->m_pRight = ConstructCore(leftPreorderEnd + 1, endPreorder,            rootInorder + 1, endInorder);    }    return root;}

  

转载于:https://www.cnblogs.com/xwz0528/p/4831177.html

你可能感兴趣的文章
帝国ECMS静态生成为一行代码/静态页面打乱教程
查看>>
IE 问题集合
查看>>
anu - browser
查看>>
[转] Fast Fourier transform — FFT (一篇不错的关于一维FFT原理及CPU实现的文章)
查看>>
Java 修饰符
查看>>
Oracle 数据库基础——安装
查看>>
【转载】在Linux中使用VS Code编译调试C++项目
查看>>
分享一个MySQL分库分表备份脚本(原)
查看>>
caffe parse_log.sh
查看>>
C#中利用iTextSharp开发二维码防伪标签(1)
查看>>
【AC自动机】[UESTC 554][USACO 2012]Video Game Combos
查看>>
C# WInform 界面左导航菜单
查看>>
Java 基础之详解 Java IO
查看>>
关于开源精神
查看>>
Stand-alone remote client demo
查看>>
【Alpha】Daily Scrum Meeting——blog3
查看>>
IMetadataAware接口的特性定制Model元数据
查看>>
sharepoint 增删改查
查看>>
友盟添加页面统计
查看>>
「踩坑记」Android API 判断权限申请结果的闪退问题
查看>>