Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
从前序和中序遍历结果,构造出一个二叉树。
前序遍历为: 根 {左子树的所有结点} {右子树所有结点}
中序遍历为: {左子树的所有结点} 根 {右子树所有结点}
即 前序的第一个元素为根, 用此元素,在中序遍历的中顺序找到其出现的位置。则此位置,分隔出了左子树和右子树。
而此位置, 同时也是 前序遍历中 左子树 与 右子树的 分界点。
两个序列的左子树和右子树的范围都确定后,可以重复上面的方法,递归应用到其左子树和右子树。
在leetcode上实际执行时间为53ms。
/**
* Definition for a binary tree node.
* 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) {
return helper(preorder, inorder, 0, preorder.size(), 0, inorder.size());
}
TreeNode *helper(vector<int> &preorder, vector<int> &inorder, int pre_start, int pre_stop, int in_start, int in_stop) {
if (pre_start >= pre_stop)
return 0;
while (inorder[in_start] != preorder[pre_start])
in_start++;
TreeNode *root = new TreeNode(preorder[pre_start]);
root->left = helper(preorder, inorder, pre_start+1, pre_stop-in_stop+in_start+1, in_stop-pre_stop+pre_start, in_start);
root->right = helper(preorder, inorder, pre_stop-in_stop+in_start+1, pre_stop, in_start+1, in_stop);
return root;
}
};Construct Binary Tree from Preorder and Inorder Traversal -- leetcode
原文地址:http://blog.csdn.net/elton_xiao/article/details/45563135