106 number-of-islands
题目:
根据一棵树的中序遍历与后序遍历构造二叉树。
思路
直白地从后续遍历的最后一个值把中序和后续的数组分成两部分,然后进行递归
/**
* 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* build(vector<int>& inorder, vector<int>& postorder,
int is, int ie, int ps, int pe)
{
if(is > ie)
return nullptr;
TreeNode* root = new TreeNode(postorder[pe]);
int i = 0;
while(i+is < ie)
{
if(inorder[i+is] != postorder[pe]) i++;
else break;
}
root->left = build(inorder, postorder, is, is+i-1, ps, ps+i-1);
root->right = build(inorder, postorder, is+i+1, ie, ps+i, pe-1);
return root;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if(inorder.size() != postorder.size())
return nullptr;
return build(inorder, postorder, 0, inorder.size()-1, 0, postorder.size()-1);
}
};
改进
其实利用中序遍历的数组就可以了,但是需要找到当前的root是哪一个,所以需要一个全局(或者传参的参数),那这样就需要先处理右子树,然后再处理左子树。
/**
* 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:
int postid;
TreeNode* build(vector<int>& inorder, vector<int>& postorder,
int is, int ie)
{
if(is > ie)
return nullptr;
TreeNode* root = new TreeNode(postorder[postid]);
int i = 0; // 当然这里可以改成用unordered_map查找下标
while(i+is < ie)
{
if(inorder[i+is] != postorder[postid]) i++;
else
break;
}
postid--;
root->right = build(inorder, postorder, is+i+1, ie);
root->left = build(inorder, postorder, is, is+i-1);
return root;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if(inorder.size() != postorder.size())
return nullptr;
postid = postorder.size()-1;
return build(inorder, postorder, 0, inorder.size()-1);
}
};