Given preorder and inorder traversal of a tree, construct the binary tree.
给了前序和中序遍历,这个题也好做,主要问题是把左右分支的下标给搞清楚。
对于前序来说,本次的根节点总是第一个preorder[0];左子树坐标是[prestart+1,prestart+i],右子树是[prestart+i+1,preend];
而对于中序来说,如果根节点是第i个(从instart开始数),那么左边子树的坐标是[instart,instart+i-1],右子树是[instart+i+1,inend];
如果觉得前序不好算的话,可以先算中序,前序的左子树段是中序左子树段+1(但是要注意初始坐标不一样)
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 struct TreeNode { 5 int val; 6 TreeNode *left; 7 TreeNode *right; 8 TreeNode(int x) : val(x), left(NULL), right(NULL) {} 9 }; 10 class Solution { 11 public: 12 TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) { 13 TreeNode * head = build(preorder,0,preorder.size()-1,inorder,0, inorder.size()-1); 14 return head; 15 } 16 17 TreeNode *build(vector<int> &preorder, int preStart,int preEnd,vector<int> &inorder, int inStart, int inEnd){ 18 if(preStart == preEnd) return new TreeNode(preorder[preStart]); 19 if(preStart > preEnd) return NULL; 20 int head = preorder[preStart]; 21 int i = 0; 22 int size = preEnd - preStart+1; 23 for(; i<size;i++){ 24 if(inorder[i+inStart] == head){ 25 break; 26 } 27 } 28 TreeNode *node = new TreeNode(head); 29 node->left = build(preorder,preStart+1,preStart+i,inorder, inStart, inStart+i-1); 30 node->right = build(preorder, preStart+1+i,preEnd,inorder,inStart+1+i,inEnd); 31 return node; 32 33 } 34 };