题目描述
Construct Binary Tree from Preorder and Inorder Traversal
Construct Binary Tree from Inorder and Postorder Traversal
Given preorder and inorder traversal of a tree, construct the binary tree.
Given inorder and postorder traversal of a tree, construct the binary tree.
Given inorder and postorder traversal of a tree, construct the binary tree.
给定先序和中序求后序或者给定后序中序求先序
总结
使用数组一下标效率会高一些
下标的确定一定要正确。
注意返回空的情况。
在vec做参数时需要使用引用,否则系统会复制导致内存溢出
代码示例
class Solution {
public:
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
int size = inorder.size();
if(size == 0) return NULL;
return buildTreeCore(inorder,0,size - 1,postorder,0,size - 1);
}
//vector必须使用传引用,否则每一次递归都会进行一次复制,内存会超出
TreeNode *buildTreeCore(vector<int> &inorder,int instart,int inend,vector<int> &postorder,int poststart,int postend)
{
if(poststart > postend)////////////////////////////////!!!!!!!!!!!!!!!!!!!
return NULL;
TreeNode *root = new TreeNode(postorder[postend]);
if(poststart == postend) //这里可以加一个报错,如果最后剩一个如果两个vector中val不一样就错了
return root;
int pos = 0;
for(int i = instart;i<=inend;i++)
if(inorder[i] == postorder[postend])
{
pos = i;
break;
}
//开始和结束点需要计算清楚
if(pos>instart)
root->left = buildTreeCore(inorder,instart,pos-1,postorder,poststart,poststart+(pos-instart)-1);
if(inend>pos)
root->right = buildTreeCore(inorder,pos+1,inend,postorder,poststart+(pos-instart),postend-1);
return root;
}
};
class Solution {
public:
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
int size = inorder.size();
if(size == 0) return NULL;
return buildTreeCore(preorder,0,size - 1,inorder,0,size - 1);
}
//vector必须使用传引用,否则每一次递归都会进行一次复制,内存会超出
TreeNode *buildTreeCore(vector<int> &preorder,int prestart,int preend,vector<int> &inorder,int instart,int inend)
{
if(prestart > preend)////////////////////////////////!!!!!!!!!!!!!!!!!!!
return NULL;
TreeNode *root = new TreeNode(preorder[prestart]);
if(prestart == preend) //这里可以加一个报错,如果最后剩一个如果两个vector中val不一样就错了
return root;
int pos = 0;
for(int i = instart;i<=inend;i++)
if(inorder[i] == preorder[prestart])
{
pos = i;
break;
}
//开始和结束点需要计算清楚
if(pos>instart)
root->left = buildTreeCore(preorder,prestart+1,prestart+(pos-instart),inorder,instart,pos-1);
if(inend>pos)
root->right = buildTreeCore(preorder,prestart+(pos-instart)+1,preend,inorder,pos+1,inend);
return root;
}
};
推荐学习C++的资料
C++标准函数库
在线C++API查询
vector使用方法