描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
class Solution {
public:
struct TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> in) {
m_pre = pre;
m_in = in;
return reConstruct(0, m_pre.size() - 1, 0);
}
struct TreeNode* reConstruct(int L1, int R1, int L2){
if (L1>R1)
return nullptr;
int cur_head = m_pre[L1];
TreeNode *head = new TreeNode(cur_head);
int i = L2;
while (m_in[i] != cur_head) ++i;
int left_len = i - L2;
head->left = reConstruct(L1 + 1, L1 + left_len, L2);
head->right = reConstruct(L1 + left_len + 1, R1, L2 + left_len + 1);
return head;
}
private:
//代替全局变量
vector<int> m_pre;
vector<int> m_in;
};
这题需要注意:递归退出的条件一定要有
if (L1>R1)
return nullptr;
一开始忽略了这个条件,导致程序内存超限,danwu很长时间