思路
title真是长..给前序遍历和中序遍历,构造二叉树。
前序遍历就是Node, Left, Right,而中序遍历是Left, Node, Right,因此给一个前序遍历的序列,他的第一个节点肯定就是那个Node,然后在中序序列里找,就能把序列分成左中右三部分。
自然地就要用递归啦~
代码
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* buildTreeSub(const vector<int>& preorder, int p_start, int p_end, const vector<int>& inorder, int i_start, int i_end){ int pivot = preorder[p_start]; TreeNode* root = new TreeNode(pivot); int indexPivotInorder = -1; for(indexPivotInorder=i_start; indexPivotInorder<=i_end; indexPivotInorder++){ if(inorder[indexPivotInorder] == pivot) break; } int len_left = indexPivotInorder-i_start; if(indexPivotInorder > i_start){ //if we still have left part root->left = buildTreeSub(preorder, p_start+1, p_start+len_left, inorder, i_start, indexPivotInorder-1); } if(indexPivotInorder < i_end){ //if we still have right part root->right = buildTreeSub(preorder, p_start+len_left+1, p_end, inorder, indexPivotInorder+1, i_end); } return root; } TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { if(preorder.empty() || inorder.empty()) return NULL; return buildTreeSub(preorder, 0, preorder.size()-1, inorder, 0, inorder.size()-1); } };