题目描述如图,就是用提供的前序遍历(preorder)和中序遍历(inorder)来构造一个二叉树,由此可知:
前序遍历 :根 左子树 右子树
中序遍历 :左子树 根 右子树
我们可以构建一个函数 TreeNode* _buildTree(vector<int>& preorder, vector<int>& inorder,int& prei,int inbegin,int inend) 来进行递归调用这个二叉树的左子树和右子树,其中prei是判断每次根节点在preorder的下标元素
那么知道前序遍历时 第一个元素肯定是这个二叉树的根,就可以new一个根节点为TreeNode* root=new TreeNode(preorder[prei]);
while(rooti<=inend)
{
if(inorder[rooti]==preorder[prei])//在中序中找到前序的根
break;
else
++rooti;
}
当我们在中序中找到根节点后,便开始对根的左子树和右子树进行递归构建
//找到根后,开始建立左子树和右子树
// [inbegin,rooti-1] rooti [rooti+1,inend]
if(inbegin<=rooti-1)
root->left=_buildTree(preorder,inorder,++prei,inbegin,rooti-1);
else
root->left=nullptr;
if((rooti+1)<=inend)
root->right=_buildTree(preorder,inorder,++prei,rooti+1,inend);
else
root->right=nullptr;
可以看出,在 // [inbegin,rooti-1] rooti [rooti+1,inend]中rooti为根=0,[inbegin,rooti-1]是中序左子树区间,[rooti+1,inend]是中序右子树区间
在条件分别为if(inbegin<=rooti-1)和if((rooti+1)<=inend)进行递归调用完成左,右子树的构建。
/**
* 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:
TreeNode* _buildTree(vector<int>& preorder, vector<int>& inorder,int& prei,int inbegin,int inend) {
TreeNode* root=new TreeNode(preorder[prei]);
int rooti=inbegin;
while(rooti<=inend)
{
if(inorder[rooti]==preorder[prei])//在中序中找到前序的根
break;
else
++rooti;
}
//找到根后,开始建立左子树和右子树
// [inbegin,rooti-1] rooti [rooti+1,inend]
if(inbegin<=rooti-1)
root->left=_buildTree(preorder,inorder,++prei,inbegin,rooti-1);
else
root->left=nullptr;
if((rooti+1)<=inend)
root->right=_buildTree(preorder,inorder,++prei,rooti+1,inend);
else
root->right=nullptr;
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int prei=0;
int inbegin=0,inend=inorder.size()-1;
return _buildTree(preorder,inorder,prei,inbegin,inend);
}
};