算法思路:
前序:根左右
中序:左根右
根據前序和中序的特點可以得知,在前序遍歷中尋找根節點,在中序遍歷中將左右子樹分開。依次遞歸下去就可以構造一個二叉樹
以其中一次爲例:
若前序中的根節點位置在中序的長度爲len那麼遞歸如下
node->left = buildTreeCore(preorder, pre_start + 1, pre_start + len, inorder, in_start, in_start + len - 1);
node->right = buildTreeCore(preorder, pre_start + len+1, pre_end, inorder, in_start+ len+1, in_end);
注意處理兩種特殊情況:
1.start==end
TreeNode* node = new TreeNode(preorder[pre_start]);
node->left = NULL;
node->right = NULL;
if (pre_start == pre_end)
return node;
2.start>end
if (pre_start > pre_end)
return NULL;
leetcode通過代碼:
TreeNode* buildTreeCore(vector<int>& preorder,int pre_start,int pre_end, vector<int>& inorder,int in_start, int in_end)
{
if (pre_start > pre_end)
return NULL;
TreeNode* node = new TreeNode(preorder[pre_start]);
node->left = NULL;
node->right = NULL;
if (pre_start == pre_end)
return node;
/*在中序中找到根的位置*/
int len = -1;
for (int i = in_start; i <= in_end; i++)
{
len++;
if (inorder[i] == preorder[pre_start])
break;
}
/*在中序中找到根的位置*/
node->left = buildTreeCore(preorder, pre_start + 1, pre_start + len, inorder, in_start, in_start + len - 1);
node->right = buildTreeCore(preorder, pre_start + len+1, pre_end, inorder, in_start+ len+1, in_end);
return node;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
TreeNode*root = NULL;
if (preorder.size() != inorder.size() || preorder.size() == 0 || inorder.size() == 0)
return root;
root= buildTreeCore(preorder, 0, preorder.size()-1, inorder, 0, inorder.size() - 1);
return root;
}