難度中等
根據一棵樹的前序遍歷與中序遍歷構造二叉樹。
注意:
你可以假設樹中沒有重複的元素。
例如,給出
前序遍歷 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;
}
希望會對你有幫助!