Update 105. Construct Binary Tree from Preorder and Inorder Traversal.md

This commit is contained in:
唐树森 2019-04-26 23:25:02 +08:00 committed by GitHub
parent fb54a4d96b
commit 3bb44ee4de
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -2,7 +2,7 @@
# 思路 # 思路
根据中序和前序遍历建树。 根据中序和前序遍历建树。
由于先序遍历的第一个肯定是根,所以原二叉树的根节点可以知道,然后由于树中没有相同元素,所以我们可以在中序遍历中也定位出根节点的位置, 由于先序遍历的第一个肯定是根,所以原二叉树的根节点可以知道,然后由于树中没有相同元素,所以我们可以在中序遍历中也定位出根节点的位置,
并以根节点的位置将中序遍历拆分为左右两个部分分别对其递归调用原函数。其中在中序遍历中定位根节点可以用个for循环也可以通过map。 并以根节点的位置将中序遍历拆分为左右两个部分分别对其递归调用原函数。其中在中序遍历中定位根节点可以用个for循环也可以通过hash即unordered_map,更快)
需要提一点的是,同时知道前序遍历(或后序遍历)和中序遍历就能够唯一确定一颗二叉树,而前序和后序则不能。 需要提一点的是,同时知道前序遍历(或后序遍历)和中序遍历就能够唯一确定一颗二叉树,而前序和后序则不能。
@ -12,7 +12,7 @@ class Solution {
private: private:
TreeNode* helper(int num, vector<int>& preorder, int pre_start, TreeNode* helper(int num, vector<int>& preorder, int pre_start,
vector<int>& inorder, int in_start, vector<int>& inorder, int in_start,
map<int, int>& mp){ unordered_map<int, int>& mp){
if(num == 0) return NULL; if(num == 0) return NULL;
int val = preorder[pre_start]; int val = preorder[pre_start];
TreeNode *node = new TreeNode(val); TreeNode *node = new TreeNode(val);
@ -24,7 +24,7 @@ private:
} }
public: public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
map<int, int>mp; unordered_map<int, int>mp;
// 用map记录某个节点在中序遍历数组中的索引 // 用map记录某个节点在中序遍历数组中的索引
for(int i = 0; i < inorder.size(); i++) mp[inorder[i]] = i; for(int i = 0; i < inorder.size(); i++) mp[inorder[i]] = i;
return helper(preorder.size(), preorder, 0, inorder, 0, mp); return helper(preorder.size(), preorder, 0, inorder, 0, mp);