第32天。
其实早在很久之前了就想着坚持了一个月之后要发票圈纪念一下的,后来想想其实也没啥必要的,感觉每天早上起来开电脑看题目已经成了习惯了,习惯有啥好纪念的(其实到100天的时候应该还是挺有意义的)。
今天的题目是Construct Binary Tree from Preorder and Inorder Traversal:
Given preorder and inorder traversal of a tree, construct the binary tree.
Note: You may assume that duplicates do not exist in the tree.
一开始没看到Note
,还觉得会有点麻烦,不过既然没有重复元素,写出一个递归解法就很简单了:
1TreeNode* buildTree1(vector<int>& preorder, vector<int>& inorder) {2 return bulidTreeIter(preorder.begin(),preorder.end(),inorder.begin(),inorder.end());3}4TreeNode *bulidTreeIter(vector<int>::iterator pBeg,vector<int>::iterator pEnd,vector<int>::iterator iBeg,vector<int>::iterator iEnd) {5 if (pEnd == pBeg) return nullptr;6 TreeNode *root = new TreeNode(*pBeg);7 auto it = find(iBeg,iEnd,*pBeg);8 int size = it - iBeg;9 root->left = bulidTreeIter(pBeg+1,pBeg + size + 1,iBeg,it);10 root->right = bulidTreeIter(pBeg+size+1,pEnd,it+1,iEnd);11 return root;12}
恩,貌似是第一次一次Submit
就直接过。
然后是在dicuss
中看到的迭代算法,但是感觉很复杂的样子,而且效率也不一定比递归版的高。
1 TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {2
3 if(preorder.size()==0)4 return NULL;5
6 stack<int> s;7 stack<TreeNode *> st;8 TreeNode *t,*r,*root;9 int i,j,f;10
11 f=i=j=0;12 s.push(preorder[i]);13
14 root = new TreeNode(preorder[i]);15 st.push(root);37 collapsed lines
16 t = root;17 i++;18
19 while(i<preorder.size())20 {21 if(!st.empty() && st.top()->val==inorder[j])22 {23 t = st.top();24 st.pop();25 s.pop();26 f = 1;27 j++;28 }29 else30 {31 if(f==0)32 {33 s.push(preorder[i]);34 t -> left = new TreeNode(preorder[i]);35 t = t -> left;36 st.push(t);37 i++;38 }39 else40 {41 f = 0;42 s.push(preorder[i]);43 t -> right = new TreeNode(preorder[i]);44 t = t -> right;45 st.push(t);46 i++;47 }48 }49 }50
51 return root;52 }