重建二叉树
递归出错简直要人命啊!!!
递归出口一定要小心,否则就会陷入无限循环中导致内存崩溃!!
这题:第一:左右子树的范围要小心,一开始没有用leftlen,直接spre+rootin!诶~~,两者没有啥关系的
第二:左右子树怎么判断停,单靠spre==epre &&sin==ein判断是不行的,它只能判断只有一个节点时。因为可能出现某个父节点只有左子树或者只有右子树,这两者都不会相等的,但却不能去找它没有的子树,所以要加上左右子树的判断。
第三:两个函数的顺序!
class Solution { public: struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in) { if(pre.empty()||in.empty()) return NULL; int len=pre.size(); if(in.size()!=len) return NULL; return construct(pre,0,len-1,in,0,len-1); } struct TreeNode* construct(vector<int> pre,int spre,int epre,vector<int> in,int sin,int ein) { TreeNode* root=new TreeNode(pre[spre]); root->left=root->right=NULL; if(spre==epre &&sin==ein) return root; int rootin=0; while(in[rootin]!=pre[spre]) rootin++; int leftlen=rootin-sin; if(leftlen>0) root->left=construct(pre,spre+1,spre+leftlen,in,sin,rootin-1); if(epre-spre-leftlen>0) root->right=construct(pre,spre+1+leftlen,epre,in,rootin+1,ein); return root; } };