剑指offer(C++)-JZ7:重建二叉树(数据结构-树)
Posted 翟天保Steven
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer(C++)-JZ7:重建二叉树(数据结构-树)相关的知识,希望对你有一定的参考价值。
作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
题目描述:
给定节点数为 n 二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。
例如输入前序遍历序列1,2,4,7,3,5,6,8和中序遍历序列4,7,2,1,5,3,8,6,则重建出如下图所示。
提示:
1.vin.length == pre.length
2.pre 和 vin 均无重复元素
3.vin出现的元素均出现在 pre里
4.只需要返回根结点,系统会自动输出整颗树做答案对比
数据范围:n≤2000,节点的值:−10000≤val≤10000
要求:空间复杂度 O(n),时间复杂度 O(n)
示例:
输入:
[1,2,4,7,3,5,6,8],[4,7,2,1,5,3,8,6]
返回值:
1,2,3,4,#,5,6,#,7,#,#,8
说明:
返回根节点,系统会输出整颗二叉树对比结果,重建结果如题面图示
解题思路:
本题考察数据结构树的使用。根据前序、中序、后序的排序重建二叉树是很常见的题目,也很基础。本题是前序和中序,前序遍历的顺序是:根结点->左子树->右子树,中序遍历的顺序是:左子树->根结点->右子树。即根节点存在前序首个位置,也存在中序遍历中间的某个位置,那么中序遍历根节点左侧的就是左子树,而前序遍历根节点后面同等数量的结点也是左子树,将这两个左子树类似操作,寻找左子树的根节点,右侧右子树同理。依次类推一层层锁定根节点,用递归很轻易的就能还原二叉树。
测试代码:
/**
* 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()==0)
return nullptr;
int first=pre[0],pos_in_mid=0;
TreeNode* head=new TreeNode(first);
for(pos_in_mid=0;pos_in_mid<vin.size();++pos_in_mid)
if(vin[pos_in_mid]==first)
break;
head->left=reConstructBinaryTree(
pre.begin()+1,pre.begin()+1+pos_in_mid, vin.begin(),vin.begin()+pos_in_mid);
head->right=reConstructBinaryTree(
pre.begin()+1+pos_in_mid,pre.end(), vin.begin()+1+pos_in_mid,vin.end());
return head;
;
以上是关于剑指offer(C++)-JZ7:重建二叉树(数据结构-树)的主要内容,如果未能解决你的问题,请参考以下文章
剑指 Offer(C++版本)系列:剑指 Offer 07 重建二叉树
剑指 Offer(C++版本)系列:剑指 Offer 07 重建二叉树
剑指 Offer(C++版本)系列:剑指 Offer 07 重建二叉树
JZ1.二维数组中的查找;JZ4. 重建二叉树;JZ7. 斐波那契数列;JZ.13 调整数组顺序使奇数位于偶数前;JZ19. 顺序打印矩阵