版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014303647/article/details/88357985
前序遍历+中序遍历构建二叉树
1、前序遍历的第一个元素A,为根结点
2、在中序遍历找到A,则在中序遍历中A左边是左子树,右边是右子树
3、递归(左右子树同样如此)
具体实现
/*
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
return help(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1);
}
TreeNode* help(vector<int>& preorder,int begin1,int end1,vector<int>& inorder,int begin2,int end2)
{
if(begin1>end1)
return NULL;
else if(begin1==end1)
return new TreeNode(preorder[begin1]);
TreeNode* root=new TreeNode(preorder[begin1]);
int i;
for(i=begin2;i<end2;i++)
if(inorder[i]==preorder[begin1])
break;
int leftlen=i-begin2;
root->left=help(preorder,begin1+1,begin1+leftlen,inorder,begin2,begin2+leftlen-1);
root->right=help(preorder,begin1+leftlen+1,end1,inorder,begin2+leftlen+1,end2);
return root;
}
};
后序遍历+中序遍历
1、后序遍历的最后一个元素A,为根结点
2、在中序遍历找到A,则在中序遍历中A左边是左子树,右边是右子树
3、递归(左右子树同样如此)
具体实现
/**
* Definition for a binary tree node.
* 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) {
return help(postorder,0,postorder.size()-1,inorder,0,inorder.size()-1);
}
TreeNode* help(vector<int>& postorder,int begin1,int end1,vector<int>& inorder,int begin2,int end2)
{
if(begin1>end1)
return NULL;
else if(begin1==end1)
return new TreeNode(postorder[end1]);
TreeNode* root=new TreeNode(postorder[end1]);
int i;
for(i=begin2;i<end2;i++)
if(inorder[i]==postorder[end1])
break;
int leftlen=i-begin2;
int rightlen=postorder.size()-leftlen;
root->left=help(postorder,begin1,begin1+leftlen-1,inorder,begin2,begin2+leftlen-1);
root->right=help(postorder,begin1+leftlen,end1-1,inorder,begin2+leftlen+1,end2);
return root;
}
};