// 辅助函数:在中序遍历数组中查找根节点的索引 intfindInOrder(int in[], int inStart, int inEnd, int target){ int i = inStart; while (i <= inEnd) { if (in[i] == target) { return i; } i += 1; } return-1; }
// 构建二叉树 BiTree buildTree(int pre[], int preStart, int preEnd, int in[], int inStart, int inEnd){ if (preStart > preEnd || inStart > inEnd) { returnNULL; }
int rootVal = pre[preStart]; BiTree root = createNode(rootVal); int inRoot = findInOrder(in, inStart, inEnd, rootVal); int leftSize = inRoot - inStart;
int leftPreStart = preStart + 1; int leftPreEnd = preStart + leftSize; int leftInStart = inStart; int leftInEnd = inRoot - 1; root->lchild = buildTree(pre, leftPreStart, leftPreEnd, in, leftInStart, leftInEnd);
int rightPreStart = preStart + leftSize + 1; int rightPreEnd = preEnd; int rightInStart = inRoot + 1; int rightInEnd = inEnd; root->rchild = buildTree(pre, rightPreStart, rightPreEnd, in, rightInStart, rightInEnd);