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; } };
时间: 2024-11-07 23:00:12