您的位置:首页 > 其它

文章标题

2016-07-22 10:30 253 查看
根据前序和中序遍历重建二叉树

class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.size() == 0 || inorder.size() == 0)
return NULL;
int start = 0;
int pend = preorder.size() - 1;
int iend = inorder.size() - 1;
return helper(preorder,0,pend,inorder,0,iend);

}
TreeNode* helper(vector<int> preorder,int pstart,int pend,vector<int> inorder,int istart,int iend){
if(pstart > pend || istart > iend)
return NULL;

int key = preorder[pstart];
TreeNode* root = new TreeNode(key);
int count = 0;
if(pstart == pend)
return root;
while (inorder[istart+count]!=key )
{
count++;
}
int pleft_start = pstart+1;
int pleft_end = pstart + count;

int pright_start = pleft_end + 1;
int pright_end = pend;

int ileft_start = istart;
int ileft_end = ileft_start + count - 1;

int iright_start = ileft_end + 2;
int iright_end = iend;

root->left = helper(preorder,pleft_start,pleft_end,inorder,ileft_start,ileft_end);
root->right = helper(preorder,pright_start,pright_end,inorder,iright_start,iright_end);
return root;
}

};


给定中序遍历和后序遍历

class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if(postorder.size() == 0 || inorder.size() == 0)
return NULL;
int start = 0;
int pend = postorder.size() - 1;
int iend = inorder.size() - 1;
return helper(postorder,0,pend,inorder,0,iend);

}
TreeNode* helper(vector<int>& postorder,int pstart,int pend,vector<int>& inorder,int istart,int iend){
if(pstart > pend || istart > iend)
return NULL;

int key = postorder[pend];
TreeNode* root = new TreeNode(key);
int leftcount = 0;
if(pstart == pend)
return root;
//求左子树个数
while (inorder[istart+leftcount]!=key )
{
leftcount++;
}
//求右子树个数,总共的个数-左子树个数
int rightcount = iend - istart -leftcount ;
//计算后序遍历的位置
int pright_start = pend - rightcount;
int pright_end = pend -1;

int pleft_start = pstart;
int pleft_end = pstart + leftcount -1;
//计算中序遍历的位置
int ileft_start = istart;
int ileft_end = ileft_start + leftcount - 1;

int iright_start = ileft_end + 2;
int iright_end = iend;

root->left = helper(postorder,pleft_start,pleft_end,inorder,ileft_start,ileft_end);
root->right = helper(postorder,pright_start,pright_end,inorder,iright_start,iright_end);
return root;
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: