從前序中序遍歷來重構二叉樹
經典題,從期末考試到考研什么的應該都有
前序遍歷第一個肯定是root
在inorder里面去找root
左邊的是leftsubtree , 右邊的是rightsubtree
然后preorder除去order,后面lifetsubtree.size 個是左邊的, rightsubtree.size個是右邊的
遞歸構造tree就好了
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: template<typename Iter> TreeNode* make(Iter pFirst , Iter pLast , Iter iFirst , Iter iLast) { if(pFirst == pLast) return nullptr; if(iFirst == iLast) return nullptr; int val = *pFirst; auto iRoot = find(iFirst , iLast , val); TreeNode* root = new TreeNode(*iRoot); int leftSize = iRoot - iFirst; root -> left = make(pFirst+1 , pFirst+leftSize+1 , iFirst , iRoot); root -> right = make(pFirst+leftSize+1 , pLast , iRoot + 1 , iLast); return root; } TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) { int size = inorder.size(); if(size == 0) return nullptr; return make(preorder.begin() , preorder.end() , inorder.begin() , inorder.end()); } };
