题目链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/
递归重构:
1.首先通过前序遍历中的第一位,确定整个二叉树的根root;
2.在中序遍历中,root左边的序列为左子树,右边的序列即为右子树;
3.确定前序遍历中的左右子树序列;
4.*通过定义四个指针来确定左右子树的起始位置;
5.*将左子树和右子树放入递归中,重复1~3;
6.左右子树不再有节点时则返回NULL。
时间复杂度:O(n),每个节点都要经过创建及重建其左右节点;
空间复杂度:O(n),需要存储整个二叉树的空间。
/**
* 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* buildTree(vector<int>& preorder, vector<int>& inorder) {
//新建子函数用于递归
//用四个指针分别表示左右子树在两个遍历中的起始点
int preStart = 0;
int preEnd = preorder.size() - 1;
int inStart = 0;
int inEnd = inorder.size() - 1;
return binaryTree(preorder, inorder, preStart, preEnd, inStart, inEnd);
}
TreeNode * binaryTree(
vector<int>& preorder, vector<int>& inorder,
int preStart, int preEnd, int inStart,int inEnd
)
{
if((preStart > preEnd) || (inStart > inEnd)) return NULL; //子树为空
TreeNode * root = new TreeNode(preorder[preStart]);
//寻找位于中序遍历中的根节点位置
int middle = inStart;
for(; middle <= inEnd; ++middle) {
if( inorder[middle] == preorder[preStart]) break;
}
root->left = binaryTree(
preorder, inorder, preStart + 1, preStart + middle - inStart, inStart, middle - 1);
root->right = binaryTree(
preorder, inorder, preEnd - (inEnd - middle) + 1, preEnd, middle + 1, inEnd);
return root;
}
};