版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fenger3790/article/details/82945683
二叉树有前序、中序、后序、层次四种遍历方式。
层次遍历我们就不考虑,因为比较简单。
我们一般是根据前序和中序、中序和后序这两种方式来重建二叉树,注意必须要有中序序列才能唯一确定一棵树。无论是前序和中序、中序和后序构建思路都是一致的。
重建的思路是采用迭代的思想:
比如依照前序和中序
1.我们设定一个函数,把前序和中序传进来,通过前序找到当前的根,并返回根。
2.在返回根之前,根据中序能知道根的左右子树分别包含哪些数字,我们就把根左边部分的中序和前序传给函数并获取返回值,将该返回值赋给当前节点的left指针;
3.根的right指针同理,根据根右边部分的中序和前序获取返回值;
4.重复上述过程,迭代结束就能获取一棵完整的树。
代码如下:
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(pre.size()==0 || vin.size()==0)
return NULL;
int root=pre[0];
vector<int> left_pre,left_vin,right_pre,right_vin;
bool find_root=false;
for(int i=0;i<vin.size();i++)
{
if(vin[i]==root)//找到根节点
{
find_root=true;
continue;
}
if(find_root)
right_vin.push_back(vin[i]);//右子树中序
else
left_vin.push_back(vin[i]);//左子树中序
}
for(int i=1;i<pre.size();i++)
{
if(left_pre.size()!=left_vin.size())
left_pre.push_back(pre[i]);//左子树前序
else
right_pre.push_back(pre[i]);//右子树前序
}
TreeNode *head=new TreeNode(root);
head->left=reConstructBinaryTree(left_pre,left_vin);
head->right=reConstructBinaryTree(right_pre,right_vin);
return head;
}
};