Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
1:注意特殊情況;2:遞迴的情況;3:遞迴結束情況;4:首先獲得根節點,之後把兩個數組分別分成兩部分,遞迴分別得出左子樹和右子樹。
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) { if(preorder.size() == 0 || inorder.size() == 0 || preorder.size() != inorder.size()) { return NULL; } int size = (int)preorder.size(); return buildTreeCore(preorder, 0, inorder, 0, size); } TreeNode* buildTreeCore(vector<int> &preorder, int preStart, vector<int> &inorder, int preIn, int length) { if(length == 1) { if(preorder[preStart] != inorder[preIn]) { return NULL; } } int rootValue = preorder[preStart]; TreeNode *root = new TreeNode(rootValue); int i = 0; for(; i < length; i++) { if(inorder[preIn + i] == rootValue) { break; } } if(i == length) { return NULL; } if(i > 0) { root->left = buildTreeCore(preorder, preStart + 1, inorder, preIn, i); } if(i < length - 1) { root->right = buildTreeCore(preorder, preStart + i + 1, inorder, preIn + i + 1, length - 1 - i); } return root; }