0 题目
输入某二叉树的前序遍历和中序遍历的结果,重建出该二叉树。
1 分析
中序遍历的结果,优先打印根节点,然后左右节点。
前序遍历的结果,优先打印左节点,然后根节点,右节点。
因此,中序遍历中第一个元素,在前序遍历的结果中可以将这个数组一分为三:左子树,根节点,右子树
因此左子树的个数可以求出来,假设为n,那么在前序遍历的结果中,第2~n个节点就是在左子树的,是左子树的前序遍历结果。 这一部分是原来问题的一个子问题。
TreeNode *reConstructBinaryTree(vector<int> pre, vector<int> in) { // 当其中一个 长度为0的时候,表明没有节点了,因此其根节点的对应子树应为nullptr // 因此这里返回nullptr int inlen = in.size(); if (inlen == 0) { return nullptr; } vector<int> left_pre, right_pre, left_in, right_in; TreeNode *head = new TreeNode(pre[0]); int gen = 0; for (int i = 0; i < inlen; i++) { if (in[i] == pre[0]) { gen = i; break; } } // 构造左子树的前序遍历结果和中序遍历结果 for (int i = 0; i < gen; i++) { left_in.push_back(in[i]); / left_pre.push_back(pre[i + 1]); //前序第一个为根节点 } // 构造右子树的前序遍历结果和中序遍历结果 for (int i = gen + 1; i < inlen; i++) { right_in.push_back(in[i]); right_pre.push_back(pre[i]); } // 分别挂到根节点的左右子树上 head->left = reConstructBinaryTree(left_pre, left_in); head->right = reConstructBinaryTree(right_pre, right_in); // 构造玩本节点的左右子树后,返回本节点,挂在到他的根节点上。 return head; }
上面是递归的解法,利用了原来的函数。
如果不进行拷贝,传入起始的迭代器的话,那么需要一个额外的递归函数。