由一个前序以及中序遍历重建一颗二叉树
经典二叉树题目,由前序遍历可知前序遍历的第一个数为当前树的头结点;
得知当前树的头结点后,由中序遍历可知左右子树的节点数量;
这样可以将前序遍历,去除头结点后,分为两部分,两部分的第一个数分别为左右子树的头结点;
递归实现,根据函数输入不同有不同写法,大体算法一致
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in) {
int head=pre[0];
int lenl,lenr;
int i,j;
vector<int> left_pre,left_in,right_pre,right_in;
TreeNode *node = new TreeNode(head); //新建树
for(i=0;in[i]!=head && i<in.size();i++); //在中序遍历中寻找头结点位置
lenl=i; //左子树节点数
lenr=in.size()-i-1; //右子树节点数
for(j=0;j<i;j++){ //将左子树前、中序遍历放入新vector中
left_pre.push_back(pre[j+1]); //注意此处,前序遍历要去除当前头结点
left_in.push_back(in[j]);
}
for(j=i+1;j<in.size();j++){ //将右子树前、中序遍历放入新vector中,注意两个循环
right_pre.push_back(pre[j]);
right_in.push_back(in[j]);
}
if(lenl>0) node->left=reConstructBinaryTree(left_pre,left_in); //递归建立左子树
if(lenr>0) node->right=reConstructBinaryTree(right_pre,right_in); //递归简历右子树
return node;
}
};