0
点赞
收藏
分享

微信扫一扫

从前序中序遍历或中序后序遍历恢复二叉树


从前序中序遍历或中序后序遍历恢复二叉树_剑指offer

 TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
//剑指Offer 第2版 64页
if(preorder.size() == 0 || inorder.size() == 0) return nullptr;
return build(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1);
}

TreeNode* build(vector<int>& preorder, int preorder_begin, int preorder_end, vector<int>& inorder, int inorder_begin, int inorder_end){
//前序遍历第一个元素是根节点
TreeNode* root = new TreeNode(preorder[preorder_begin]);

//截止条件
if(preorder_begin == preorder_end) return root;

//根据根节点的值在中序遍历中划分出左子树和右子树
int root_inorder = inorder_begin;
for(; root_inorder <= inorder_end; root_inorder++){
if(preorder[preorder_begin] == inorder[root_inorder]){
break;
}
}
//if(root_inorder == inorder.size()) //没有找到根节点
int leftlength = root_inorder - inorder_begin;
int leftpreorderend = preorder_begin + leftlength;
//根据中序遍历的划分出的左右子树,更新preorder_begin,preorder_end,inorder_begin,inorder_end
if(leftlength > 0){
root->left = build(preorder,preorder_begin + 1,leftpreorderend, inorder, inorder_begin, root_inorder-1);
}
if(inorder_end - root_inorder > 0){
root->right = build(preorder,leftpreorderend+1,preorder_end, inorder, root_inorder+1, inorder_end);
}
return root;
}

从前序中序遍历或中序后序遍历恢复二叉树_leetcode_02

TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if(inorder.size() == 0 || postorder.size() == 0) return nullptr;
return build(inorder,0,inorder.size()-1,postorder,0,postorder.size()-1);
}
TreeNode* build(vector<int>& inorder, int inorder_begin, int inorder_end, vector<int>& postorder, int postorder_begin, int postorder_end){
if(inorder_begin > inorder_end || postorder_begin > postorder_end) return nullptr;

//找到根节点
TreeNode* root = new TreeNode(postorder[postorder_end]);

//if(inorder_begin == inorder_end) return root;




int root_pos = inorder_begin;
for(;root_pos<=inorder_end;root_pos++){
if(inorder[root_pos] == postorder[postorder_end])
{
break;
}
}
int left_len = root_pos - inorder_begin;

root->left = build(inorder, inorder_begin, inorder_begin + left_len - 1,postorder, postorder_begin, postorder_begin + left_len - 1);
root->right = build(inorder, root_pos + 1, inorder_end, postorder, postorder_begin+left_len,postorder_end-1);
return root;
}

从前序中序遍历或中序后序遍历恢复二叉树_leetcode_03


举报

相关推荐

0 条评论