題目
利用前序(Preorder)和中序(Inorder)去建構一棵樹
解題方法
在解決此問題,需要先知道Preorder和Inorder是如何相互應用,結合出一棵唯一樹。
首先,Preorder的產生為DLR,而Inorder為LDR。L為左子節點,D為父節點,R為右子節點,而在Preorder的第一元素都為一棵樹的Root。
只要熟悉此相關Tree之特性,其問題就較容易解決。分別找出Root及其對應左、右子樹。
程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public: TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { return findNode(0,preorder.size()-1,0,inorder.size()-1,preorder,inorder); }
TreeNode* findNode(int preStart,int preEnd,int inStart,int inEnd,vector<int>& preorder, vector<int>& inorder) { if(preStart > preEnd || inStart > inEnd) return nullptr; int idx = 0; TreeNode* node = new TreeNode(preorder[preStart]); for(int i = inStart;i<=inEnd;++i) { if(node->val == inorder[i]) idx = i; } node->left = findNode(preStart+1,preEnd+idx-1,inStart,idx-1,preorder,inorder); node->right = findNode(preStart+idx+1-inStart,preEnd,idx+1,inEnd,preorder,inorder); return node; } };
|