题目
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
题目分析
- 要求:前序遍历 + 中序遍历 ==> 构造二叉树
分析
前序遍历的第一个结点 ==> 根结点A
中序遍历中找到A ==> A左侧为左子树右侧为右子树
解题思路
变量 | 作用 |
---|---|
next1 | 存放左子树的前序遍历 |
next2 | 存放左子树的中序遍历 |
next3 | 存放右子树的前序遍历 |
next4 | 存放右子树的前序遍历 |
过程
- 前序遍历的第一个结点为根结点
- 中序遍历找到根结点
==> 左侧为左子树的中序遍历+右侧为右子树的中序遍历 - 根据中序遍历的左右子树个数确定其对应的前序遍历
- 递归
代码如下
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.size()==0 || inorder.size()==0) return NULL;
TreeNode *root = new TreeNode(preorder[0]);
int i;
for (i = 0; i < inorder.size(); i++)
if (inorder[i] == preorder[0]) break; //找到根结点
if(i > 0) {
vector<int> next1;
for (int j = 1;j <= i; j++) {
next1.push_back(preorder[j]);
}
vector<int> next2;
for (int j = 0; j < i; j++) {
next2.push_back(inorder[j]);
}
root->left = buildTree(next1, next2);
} else root->left = NULL;
if(i < preorder.size() - 1) {
vector<int> next3;
for (int j = i + 1;j < preorder.size(); j++) {
next3.push_back(preorder[j]);
}
vector<int> next4;
for (int j = i + 1;j < preorder.size(); j++) {
next4.push_back(inorder[j]);
}
root->right = buildTree(next3, next4);
} else root->right = NULL;
return root;
}
};