/**
* 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* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
if(pre.empty()|| vin.empty()||(pre.size()!= vin.size())) //1.边界判断
return nullptr;
return CreateBinaryTree(pre, 0, pre.size()-1, vin, 0, vin.size()-1);
}
TreeNode* CreateBinaryTree(vector<int> pre, int b1, int e1, vector<int> vin, int b2, int e2)
{
if(b1>e1 || b2>e2)//终止条件,当各自的index达到最大值.
return nullptr;
TreeNode *root = new TreeNode(pre[b1]); //前序中的第一个节点作为根节点
for(int i = b2; i<= e2;i++)
{
if(vin[i] == pre[b1]) //再中序中进行遍历,得到根节点的位置,
{
root->left = CreateBinaryTree(pre, b1+1, b1+ i -b2, vin, b2, i-1);//以根节点来构造左子树
root->right = CreateBinaryTree(pre, b1+i-b2+1, e1, vin, i+1, e2); //以根节点来构造右子树
break;
}
}
return root;
}
};
剑指offer:重建二叉树
最新推荐文章于 2022-03-15 12:08:07 发布