Question:
Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
Anwser 1 :
/**
* 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 *build(vector<int> &preorder, vector<int> &inorder, int sPre, int ePre, int sMid, int eMid) {
if (sPre > ePre || sMid > eMid) return NULL;
int pivot = preorder[sPre];
int pos;
for (pos = sMid; pos <= eMid; pos++) {
if (inorder[pos] == pivot)
break;
}
TreeNode *parent = new TreeNode(pivot);
parent->left = build(preorder, inorder, sPre + 1, sPre + (pos - sMid), sMid, pos - 1);
parent->right = build(preorder, inorder, sPre + (pos - sMid) + 1, ePre, pos + 1, eMid);
return parent;
}
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
return build(preorder, inorder, 0, preorder.size() - 1, 0, inorder.size() - 1);
}
};
Anwser 2 :
/**
* 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 *buildTree(vector<int> &preorder, vector<int> &inorder) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int size = preorder.size();
if(size == 0) return NULL;
return BuildBT(preorder, inorder, 0, 0, size-1);
}
TreeNode *BuildBT(vector<int> &preorder, vector<int> &inorder, int pos, int start, int end){
if(start > end ) return NULL;
int j = std::find(inorder.begin() + start, inorder.end() + end, preorder[pos]) - inorder.begin();
TreeNode *root = new TreeNode(inorder[j]);
root->left = BuildBT(preorder, inorder, pos+1, start, j-1);
root->right = BuildBT(preorder, inorder, j+pos-start+1, j+1, end); // j+pos-start+1 is the relative position in the preorder array of the next right child
return root;
}
};
分享到:
相关推荐
105.construct_binary_tree_from_preorder_and_inorder_traversal从前序
Javascript 的解决方案Leetcode Problems and interview problems in Javascript10 Regular Expresion Matching.js100 Same Tree.js101 Symmetric Tree.js102 Binary Tree Level Order Traversal.js103 Binary Tree ...
Inorder Traversal 用两个栈实现队列 232. Implement Queue using Stacks 旋转数组的最小数字 153. Find Minimum in Rotated Sorted Array 斐波那契数列 509. Fibonacci Number 跳台阶 70. Climbing Stairs 变态跳...
105.construct-binary-tree-from-preorder-and-inorder-traversal (从前序与中序遍历序列构造二叉树) 106.construct-binary-tree-from-inorder-and-postorder-traversal (从中序与后序遍历序列构造二叉树) 112.path-...
[105_construct-binary-tree-from-preorder-and-inorder-traversal.cpp] [106_construct-binary-tree-from-inorder-and-postorder-traversal.cpp] [107_binary-tree-level-order-traversal-ii.cpp] [108_convert-...
construct-binary-tree-from-preorder-and-inorder-traversal 无官方题解 106 construct-binary-tree-from-inorder-and-postorder-traversal 无官方题解 116 populating-next-right-pointers-in-eac
421 | [Maximum XOR of Two Numbers in an Array](https://leetcode.com/problems/maximum-xor-of-two-numbers-in-an-array/) | [C++](./C++/maximum-xor-of-two-numbers-in-an-array.cpp) [Python](./Python/...