要求
- 时间限制:1秒
- 空间限制:32768K
- 热度指数:501448
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路
递归方法:前序遍历
该方法参考了牛客网该题的评论,python实现的方法非常巧妙,巧妙之处在于每次递归前序遍历的第一个元素都被弹出。python的递归函数主要是利用了左右子树的根节点(由前序遍历组成,这个pre不一定是当前子树的前序遍历,但是第一个元素一定是根节点)和中序遍历。
python实现
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回构造的TreeNode根节点
def reConstructBinaryTree(self, pre, tin):
# write code here
if not pre or not tin:
return None
root = TreeNode(pre.pop(0))
index = tin.index(root.val)
root.left = self.reConstructBinaryTree(pre, tin[:index])
root.right = self.reConstructBinaryTree(pre, tin[index+1:])
return root
- 运行时间:44ms
- 占用内存:5728k
C++实现
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<int> pre,vector<int> vin) {
if(pre.size() != vin.size() || pre.size() == 0 || vin.size() == 0)
return NULL;
int i = 0;
while(vin[i] != pre[0])
i++;
vector<int> preLeft(i);
vector<int> inLeft(i);
vector<int> preRight(pre.size()-i-1);
vector<int> inRight(pre.size()-i-1);
TreeNode* root = new TreeNode(pre[0]);
for(int j=0; j<pre.size(); j++) {
if(j < i){
preLeft[j] = pre[j+1];
inLeft[j] = vin[j];
}
else if(j > i) {
preRight[j-i-1] = pre[j];
inRight[j-i-1] = vin[j];
}
}
root->left = reConstructBinaryTree(preLeft, inLeft);
root->right = reConstructBinaryTree(preRight, inRight);
return root;
}
};
- 运行时间:5ms
- 占用内存:472k