Rebuild the binary tree (pre-order middle-order, post-order middle-order)
Construct a binary tree based on pre-order and middle-order:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int index=0;
TreeNode* rebuild(vector<int> pre,vector<int> vin, int left, int right)
{
if(left==right || pre.size()==index)
{
return nullptr;
}
TreeNode *head=NULL;
for(int i=left;i<right; i++)
{
if(pre[index]==vin[i])//查找分界点
{
head=new TreeNode(pre[index]);
index++;
head->left=rebuild(pre, vin, left, i);
head->right=rebuild(pre, vin, i+1, right);
break;
}
}
return head;
}
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
int left=0;
int right=vin.size();
TreeNode* head=rebuild(pre,vin,left,right);
return head;
}
};
New update:
Rebuild the binary tree in the middle order and post order , the same as the preorder middle order, but the order of the left and right subtrees is changed :
head->right = rebuild(vin, pos, i+1, right);
head->left = rebuild(vin, pos, left, i);
Because index– is the root node of the right subtree, the right subtree is constructed first.
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int index = 0;
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
index = postorder.size() - 1;
int left = 0;
int right = inorder.size();
TreeNode* head = rebuild(inorder, postorder, left, right);
return head;
}
TreeNode* rebuild(vector<int> vin,vector<int> pos, int left, int right)
{
if(left == right)
{
return nullptr;
}
TreeNode* head = NULL;
for(int i = left; i < right; i++)
{
if(vin[i] == pos[index])
{
index--;
head = new TreeNode(vin[i]);
head->right = rebuild(vin, pos, i+1, right);
head->left = rebuild(vin, pos, left, i);
break;
}
}
return head;
}
};
↓The following looks different ↓I just reluctant to delete...
Construct a binary tree according to the middle order and the post order (note: pre is temporarily post order traversal):
post order pre: [3,4,2,6,7,5,1]
middle order vin: [3,2,4,1 ,6,5,7]
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* rebuild(vector<int> pre,vector<int> vin, int prel, int prer,int vinl,int vinr)
{
if(left==right)
{
return nullptr;
}
TreeNode *head=NULL;
for(int i=vinl;i<=vinr; i++)
{
if(pre[prer]==vin[i])//查找中序遍历vin分界点i ,左边左子树,右边右子树
{
head=new TreeNode(pre[prer]);//构建根节点
head->left=rebuild(pre, vin, prel,i-vinl-1+prel,vinl,i-1);//pre【prel,i-vinl-1+prel】和vin【vinl,i-1】构建左子树
head->right=rebuild(pre, vin, prel+i-vinl, prer-1,i+1,vinr);//pre【prel+i-vinl, prer-1l】和vin【i+1,vinr】构建左子树
break;
}
}
return head;
}
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
TreeNode* head=rebuild(pre,vin,0,pre.size()-1,0,vin.size()-1);
return head;
}
};