1,中序和后序重建二叉树
中心思想:
从前序遍历中顺序依次拿出一个值,这个值肯定是根,并找出这个值在中序数组的下标,将中序数组划分为左右两份,分别递归。
注意:遍历前序数组需要传索引的指针,因为每次递归的索引都不一样
//重建二叉树
#include<vector>
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> vin) {
if (0 == pre.size() || 0 == vin.size())
return NULL;
int index = 0;
index为前序遍历的索引,会贯穿整个递归过程,所以用传指针的方式,保证不会因为进入 新的函数而错乱,之前用static定义,但是不能AC
TreeNode*tmp = _reConstructBinaryTree(pre, vin, 0, pre.size() - 1, &index);
return tmp;
}
TreeNode* _reConstructBinaryTree(vector<int> pre, vector<int>vin, int left, int right,int * index)
{
//递归的出口
if (left > right)
return NULL;
//在前序遍历中找本次递归要创建的节点
int i = 0;
while (pre[*index] != vin[i])
{
i++;
}
(*index)++;//为下次寻找做准备
TreeNode* newHead = new TreeNode(vin[i]);
newHead->left = _reConstructBinaryTree(pre, vin, left, i - 1, index);
newHead->right = _reConstructBinaryTree(pre, vin, i + 1, right,index);
return newHead;
}
};
int main()
{
Solution s;
vector<int> pre = { 1, 2, 4, 7, 3, 5, 6, 8 };
vector<int> vin = { 4, 7, 2, 1, 5, 3, 8, 6 };
s.reConstructBinaryTree(pre,vin);
return 0;
}
2,根据中序和后序数组重建二叉树
中心思想:和根据前序中序重建二叉树差不多,不同点是,遍历后序数组要从后开始遍历,并且要先创建右子树,这样才能使得后序的下个索引在 i+1 和 right 的范围内,若先创建左子树,那么找到的下标不在 left 到 i-1的范围内
#include<vector>
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
if (inorder.size() == 0 || postorder.size() == 0)
return NULL;
int index = postorder.size()-1;
TreeNode*tmp=_buildTree(inorder, postorder, 0, inorder.size() - 1, &index);
return tmp;
}
TreeNode* _buildTree(vector<int> &inorder, vector<int> &postorder,int left, int right,int* index)
{
if (left > right)
return NULL;
//在中序遍历中找后序遍历下标为*index的值
int i = 0;
while (inorder[i] != postorder[*index])
{
i++;
}
(*index)--;
TreeNode* root = new TreeNode(inorder[i]);
root->right = _buildTree(inorder, postorder, i + 1, right, index);
root->left = _buildTree(inorder, postorder, left, i - 1, index);
return root;
}
};