1.前序遍历数组中的第一个元素就是二叉树的根节点。
2.根节点将中序遍历数组从中间划分为左子树部分和右子树部分。
3.前序遍历数组中的左子树与右子树的长度与中序遍历相同,于是也一分为二。
4.递归。
5.(附加)前序+后序遍历数组是无法唯一确定一棵二叉树的,因为左子树与右子树的界限无法得知。
代码:
TreeNode* buildBinTree(const vector<int>& preOrder, int preFirst, int preLast,
const vector<int>& inOrder, int inFirst, int inLast) {
if (preFirst >= preLast || inFirst >= inLast) return nullptr;
TreeNode* root = new TreeNode(preOrder[preFirst]);
//寻找中序数组中根节点的位置
//继而求出左子树和右子树的节点数
vector<int>::const_iterator rootPosIte = find(inOrder.begin(), inOrder.end(), preOrder[preFirst]);
int rootPos = distance(inOrder.begin(), rootPosIte);
//递归构建左子树和右子树
root->left = buildBinTree(preOrder, preFirst+1, preFirst+1+rootPos-inFirst, inOrder, inFirst, rootPos);
root->right = buildBinTree(preOrder, preFirst+1+rootPos-inFirst, preLast, inOrder,rootPos+1, inLast);
//返回根节点
return root;
}
TreeNode* createBinTree(const vector<int>& preOrder, const vector<int>& inOrder) {
return buildBinTree(preOrder, 0, preOrder.size(), inOrder, 0, inOrder.size());
}