中级农民
- 积分
- 126
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-4-22
- 最后登录
- 1970-1-1
|
本帖最后由 zhuli19901106 于 2015-7-20 22:19 编辑
Construct Binary Tree from Inorder and Postorder Traversal
题意:给定中序和后序遍历,请重建一棵二叉树。
解法1:用递归的方法重建,找出根节点的位置。
代码1:- /**
- * Definition of TreeNode:
- * class TreeNode {
- * public:
- * int val;
- * TreeNode *left, *right;
- * TreeNode(int val) {
- * this->val = val;
- * this->left = this->right = NULL;
- * }
- * }
- */
- class Solution {
- /**
- *@param inorder : A list of integers that inorder traversal of a tree
- *@param postorder : A list of integers that postorder traversal of a tree
- *@return : Root of a tree
- */
- public:
- TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
- int n = inorder.size();
- if (n == 0) {
- return NULL;
- }
- return construct(inorder, postorder, 0, n - 1, 0, n - 1);
- }
- private:
- TreeNode *construct(vector<int> &in, vector<int> &post,
- int ill, int irr, int pll, int prr) {
- int rootVal = post[prr];
- TreeNode *r = new TreeNode(rootVal);
- int i;
- for (i = ill; i <= irr; ++i) {
- if (in[i] == rootVal) {
- break;
- }
- }
- int len;
- if (i > ill) {
- len = i - ill;
- r->left = construct(in, post, ill, i - 1, pll, pll + len - 1);
- }
- if (i < irr) {
- len = irr - i;
- r->right = construct(in, post, i + 1, irr, prr - len, prr - 1);
- }
- return r;
- }
- };
复制代码 复杂度1:时间平均为O(N * log(N)),最坏可以变成O(N ^ 2),空间是O(N)。
解法2:因为节点中不存在重复的值,所以借助hashing可以在O(1)时间找到根节点的位置。于是总体复杂度降到了O(N)。其实就算有重复的值,也可以用类似的思路实现,不过代码会更难写就是了。
代码2:- // Make it faster with hashing.
- /**
- * Definition of TreeNode:
- * class TreeNode {
- * public:
- * int val;
- * TreeNode *left, *right;
- * TreeNode(int val) {
- * this->val = val;
- * this->left = this->right = NULL;
- * }
- * }
- */
- class Solution {
- /**
- *@param inorder : A list of integers that inorder traversal of a tree
- *@param postorder : A list of integers that postorder traversal of a tree
- *@return : Root of a tree
- */
- public:
- TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
- inPos.clear();
- int n = inorder.size();
- if (n == 0) {
- return NULL;
- }
- int i;
- for (i = 0; i < n; ++i) {
- inPos[inorder[i]] = i;
- }
- return construct(inorder, postorder, 0, n - 1, 0, n - 1);
- }
- private:
- unordered_map<int, int> inPos;
-
- TreeNode *construct(vector<int> &in, vector<int> &post,
- int ill, int irr, int pll, int prr) {
- int rootVal = post[prr];
- TreeNode *r = new TreeNode(rootVal);
- int i = inPos[rootVal];
- int len;
- if (i > ill) {
- len = i - ill;
- r->left = construct(in, post, ill, i - 1, pll, pll + len - 1);
- }
- if (i < irr) {
- len = irr - i;
- r->right = construct(in, post, i + 1, irr, prr - len, prr - 1);
- }
- return r;
- }
- };
复制代码 复杂度2:时间O(N),空间O(N)。
|
|