难度中等
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3 / \ 9 20 / \ 15 7
其实思路还是比较清楚的
preorder第一个元素为root,在inorder里面找到root,在它之前的为左子树(长l1),之后为右子树(长l2)。
preorder[1]到preorder[l1]为左子树,之后为右子树,分别递归。
构建树
#include <iostream>
#include <vector>
using namespace std;
//Definition for a binary tree node.
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int presize = preorder.size();
int i;
int rootin = 0;
if(presize <= 0){
return NULL;
}
TreeNode *root = new TreeNode(preorder[0]);
for(i = 0; i < presize; i++){
if(inorder[i] == preorder[0]){
rootin = i;
}
}
vector<int> leftpre; //左边的树的前序表
vector<int> leftin; //左边的树的中序表
vector<int> rightpre; //右边的树的前序表
vector<int> rightin; //右边的树的中序表
for(i = 1; i <= rootin; i++){
leftpre.push_back(preorder[i]);
}
for(i = 0; i <= rootin - 1; i++){
leftin.push_back(inorder[i]);
}
for(i = rootin + 1; i < presize; i++){
rightpre.push_back(preorder[i]);
}
for(i = rootin + 1; i < presize; i++){
rightin.push_back(inorder[i]);
}
root -> left = buildTree(leftpre, leftin);
root -> right = buildTree(rightpre, rightin);
return root;
}
int main(){
TreeNode *root;
int pre[] = {3,9,20,15,7};
int in[] = {9,3,15,20,7};
vector<int> preorder(pre, pre + 5);
vector<int> inorder(in, in + 5);
root = buildTree(preorder, inorder);
cout << root -> right -> val << endl;
return 0;
}
希望会对你有帮助!