标签:offer ++ class efi bin ott back ini dtree
输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。
注意:
二叉树中每个节点的值都互不相同;
输入的前序遍历和中序遍历一定合法;
给定:
前序遍历是:[3, 9, 20, 15, 7]
中序遍历是:[9, 3, 15, 20, 7]
返回:[3, 9, 20, null, null, 15, 7, null, null, null, null]
返回的二叉树如下所示:
3
/ 9 20
/ 15 7
想法:前序遍历是 根->左->右,中序遍历是左->中->右.先找到根节点,在根节点左边是左子树,右边是右子树。然后递归重建二叉树
/** * 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: map<int, int> pos; TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { int n = inorder.size();
//将中序遍历的结果存放在hash表中,能够顺序读取 for(int i = 0 ; i < n ; i++){ pos[inorder[i]] = i; } return dfs(preorder, inorder, 0, n - 1, 0, n - 1); } TreeNode* dfs(vector<int>& pre, vector<int>& in, int pl, int pr, int il, int ir){ if(pl > pr){ return nullptr; } //找到根节点
auto root = new TreeNode(pre[pl]); //找到根节点对应的索引 int k = pos[root->val]; //pl+1是前序遍历中左子树起始位置,结束位置是k-il+pl,中序遍历左子树起始点是il,终止位置是k-1
auto left = dfs(pre, in ,pl+1, pl + k-il,il,k-1); //pl+k-il+1是前序遍历中左序子树的起始点,结束位置是pr,,中序遍历右子树起始点是k+1,终止位置是ir
auto right = dfs(pre ,in, pl + k - il + 1, pr, k+1, ir); root->left = left; root->right = right; return root; } };
标签:offer ++ class efi bin ott back ini dtree
原文地址:https://www.cnblogs.com/tingweichen/p/10624673.html