博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指Offer -4- 重建二叉树 - C++/Java
阅读量:3899 次
发布时间:2019-05-23

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

重建二叉树

题目来源:

题目描述

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


解题思路:

例如:

前序序列{1,2,4,7,3,5,6,8} = pre
中序序列{4,7,2,1,5,3,8,6} = in

  • 根据当前前序序列的第一个结点确定根结点,为 1
  • 找到 1 在中序遍历序列中的位置,为 in[3]
  • 切割左右子树,则 in[3] 前面的为左子树, in[3] 后面的为右子树
  • 则切割后的左子树前序序列为:{2,4,7},切割后的左子树中序序列为:{4,7,2};
  • 切割后的右子树前序序列为:{3,5,6,8},切割后的右子树中序序列为:{5,3,8,6}
  • 对子树分别使用同样的方法分解

代码:

1. C++
/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {
public: TreeNode* reConstructBinaryTree(vector
pre,vector
vin) {
int len = vin.size(); if(len <= 0) return NULL; // 存储在前序遍历和中序遍历序列中的左右子树顺序 vector
pre_left, pre_right; vector
vin_left, vin_right; // 1. 创建根节点,即先序遍历的第一个结点 TreeNode *root = new TreeNode(pre[0]); // 2. 在中序遍历中查找根节点, 下标存放在index中 int index = 0; for(int i = 0; i < len; i++){
if(vin[i] == pre[0]){
index = i; break; } } // 3. 中序遍历中根节点的左侧为左子树,右侧为右子树 // 根据 中序遍历左/右子树的数量 确定 左/右子树在先序遍历中的序列 for(int i = 0; i < index; i++){
vin_left.push_back(vin[i]); pre_left.push_back(pre[i+1]); } for(int i = index+1; i
left = reConstructBinaryTree(pre_left, vin_left); root->right = reConstructBinaryTree(pre_right, vin_right); return root; }};
2. Java
/** * Definition for binary tree * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */import java.util.Arrays;public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
int len = pre.length; if(pre.length <= 0 || in.length <= 0) return null; TreeNode root = new TreeNode(pre[0]); for(int i = 0; i < len; i++){
if(in[i] == pre[0]){
//copyOfRange是左闭右开的 //左子树 root.left = reConstructBinaryTree(Arrays.copyOfRange(pre,1,i+1), Arrays.copyOfRange(in,0,i)); // 右子树 root.right = reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,len), Arrays.copyOfRange(in,i+1,len)); break; } } return root; }}
  • 关于Java中的Arrays.copyOfRange() 方法
    要使用这个方法,首先要 import java.util.*;
    Arrays.copyOfRange(T[ ] original,int from,int to)
    将一个原始的数组original,从下标from开始复制,复制到上标to,生成一个新的数组。
    注意这里包括下标from,不包括上标to

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

你可能感兴趣的文章
java继承 long和float小记点
查看>>
记录几点在开发中遇到的问题 2015-7-28 (会更新)
查看>>
网银在线的异步操作代码示意图
查看>>
火狐Firefox浏览器安装Selenium_IDE的步骤以及其使用规则
查看>>
记录运行代码的时间长短
查看>>
关于yii2的一些知识的学习笔述
查看>>
用纯php实现MVC框架,文件目录模仿yii2
查看>>
新开发的体重管理项目----用纯php模仿yii2框架建立的
查看>>
JavaScript面向对象编程指南 的笔记
查看>>
在 2016 年做 PHP 开发是一种什么样的体验?(一)
查看>>
PHP获取客户端的IP
查看>>
从头开始学习yii2---1.搭建yii2开发环境
查看>>
从头开始学习yii2---3.语言包的配置
查看>>
yii2-表单验证的一些规则
查看>>
索引相关问题
查看>>
php面试可能会被问道的技术题汇总
查看>>
php面试题1-线程和进程的区别(顺带提下协程)
查看>>
php面试题2-用到过的传输协议
查看>>
php面试题3-yii2和yii的不一样的地方
查看>>
IOS 一些好的框架和 技术大牛的博客
查看>>