博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer 题目4
阅读量:6262 次
发布时间:2019-06-22

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

题目描述

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

大致思路

pre = {根节点,左子树,右子树}

vin = {左子树,根节点,右子数}

前序列表中第一个是二叉树的根节点,由于题目中数据都不重复,那么我们找到中序列表中的根节点的位置,那么左边部分就是左子树的全部,右边就是右子树的全部元素。然后利用递归就可以得到最终的二叉树了。

代码

TreeNode* reConstructBinaryTree(vector
pre, vector
vin) { size_t pre_len = pre.size(), vin_len = vin.size(); if ( vin_len == 0 || pre_len == 0){ return NULL; } TreeNode *temp_ptr = new TreeNode(pre[0]); vector
l_pre, l_vin, r_pre, r_vin; int mid = -1; for (size_t i = 0; i < vin_len; ++i){ if (vin[i] == pre[0]){ mid = i; continue; } if (mid < 0){ l_vin.push_back(vin[i]); } else{ r_vin.push_back(vin[i]); } } for (size_t i = 1; i < pre_len; ++i){ if (i <= mid){ l_pre.push_back(pre[i]); } else{ r_pre.push_back(pre[i]); } } temp_ptr->left = reConstructBinaryTree(l_pre, l_vin); temp_ptr->right = reConstructBinaryTree(r_pre, r_vin); return temp_ptr;}复制代码

总结

这道题整体思路熟悉二叉树的前中后遍历方法的话,还是比较简单的,但是如果只是大概了解的话,可能写代码的过程中还是会被卡两下的,特别是个别的地方,找根节点的位置的时候,之前把 mid 声明称 size_t 因为编译器警告下面的判断类型不匹配。结果就踩到坑中还半天不自知,最后想了想,算了还是声明成负数,简单而且正常也不会出现啥问题啊 手动滑稽。

转载地址:http://tnesa.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
(一)指南一、初学者指南1、简介2、安装
查看>>
约瑟夫·奈:透视网络空间
查看>>
我的友情链接
查看>>
大数据入门基础:Hadoop简介
查看>>
jdk1.7新特性
查看>>
杭电1029--Ignatius and the Princess IV(哈希)
查看>>
使用CSS3改变文本选中的默认颜色
查看>>
课后作业-阅读任务-阅读提问-3
查看>>
[130_存储业务]002_富士通存储系统Eternus_高级拷贝之对等拷贝(Advanced Copy EC)
查看>>
计算器作业(摘要算法)
查看>>
嵌入式 Linux 学习 之路
查看>>
北大acm1006
查看>>
下载PhantomJS
查看>>
IOS 3D UI --- CALayer的transform扩展
查看>>
前端常识
查看>>
使用sqlyog将sql server 迁移到mysql
查看>>
解决浏览器Adobe Flash Player不是最新版本问题
查看>>
hdu1503
查看>>
Ubuntu Server14.04 32位安装odoo8.0简单方法
查看>>