重建二叉树(NC12/考察次数Top31/难度中等)
Posted 码农指南
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重建二叉树(NC12/考察次数Top31/难度中等)相关的知识,希望对你有一定的参考价值。
描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
示例1
输入:
[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]
返回值:
{1,2,5,3,4,6,7}
(题目来自牛客网)
用C++实现如下
/**
* //定义二叉树的结构,包括val,TreeNode* left和TreeNode* right
* 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) {
//思路,输入某二叉树的前序遍历和中序遍历结果,重建改二叉树
//前序遍历为 根 左(全部) 右(全部)
//中序遍历为 左(全部) 根 右(全部)
//前序和后序可以实现父子节点的分离,配合中序遍历,可以确定一棵树(前提是不含有重复的val值)
//方法,使用递归算法进行求解
return rebuild(pre, 0, pre.size()-1, vin, 0, vin.size()-1); //使用rebuild递归函数进行求解;
}
TreeNode* rebuild(vector<int>& pre, int pre_left, int pre_right,
vector<int>& vin, int vin_left, int vin_right){
if(pre_left > pre_right) //size等于0,表示为空,vin与之对应着
return nullptr;
TreeNode* root = new TreeNode(pre[pre_left]); //建立根节点,前序遍历第一个为根节点,括号中放val值;
for(int i = vin_left; i<=vin_right; i++) //遍历中序,直到找到根节点的val;(由于不重复)
{
if(vin[i] == pre[pre_left]) //碰到了根节点;
{
root->left = rebuild(pre, pre_left+1, pre_left+i-vin_left, vin, vin_left, i-1);
//由于是根据中序进行遍历的,根据for循环可以知道,i-vin_left可以表示根节点左边有多少个元素
root->right = rebuild(pre, pre_left+i-vin_left+1, pre_right, vin, i+1, vin_right);
break;
}
}
return root; //返回值
}
};
纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!
以上是关于重建二叉树(NC12/考察次数Top31/难度中等)的主要内容,如果未能解决你的问题,请参考以下文章
二叉树的之字形层序遍历(NC14/考察次数Top21/难度中等)
二叉树根节点到叶子节点的所有路径和(NC5/考察次数Top53/难度中等)
在二叉树中找到两个节点的最近公共祖先(NC102/考察次数Top25/难度中等)